This is a quick view of the education expenditure across the globe. We try to see where we seat between some ambitious goals of the SDG 4 we’ve planned to achieve in 2030 and where we were in 2015.

0.1 Loading data

Country Target Indicator Number Indicator Name Year Value Code region Income group
Aruba 1.a 1.a.2 Expenditure on education as a percentage of total government expenditure (%) 2015 23.20 ABW Latin America & Caribbean High income
Aruba 4.5 4.5.6 Initial government expenditure on education as a percentage of GDP (%) 2014 5.78 ABW Latin America & Caribbean High income
Aruba 4.5 4.5.6 International expenditure on education as a percentage of GDP (%) 2013 2.63 ABW Latin America & Caribbean High income
Aruba 4.5 4.5.6 International expenditure on education as a percentage of GDP (%) 2016 2.19 ABW Latin America & Caribbean High income
Aruba 4.2 4.2.4 Net enrolment rate, pre-primary, female (%) 2013 98.89 ABW Latin America & Caribbean High income
Aruba 4.5 4.5.6 International expenditure on education as a percentage of GDP (%) 2014 2.00 ABW Latin America & Caribbean High income

0.2 Analysis of the expenditure on education as a percentage of total government expenditure (%)

0.2.0.0.2 Source : http://sdg4-data.uis.unesco.org/

The graph above shows the median value trends of the expenditure on education as a percentage of total government expenditure (%) for different regions from 2015 to 2022. The trend has been an overall fall down. The cross-regional expenditure on education as a percentage of total government (%) has diminished by 3.5% points between 2016 and 2022 showing that priorities are being given to others sector at the spend of the education one. The decline has been most pronounced in East Asia & Pacific and Middle East & North Africa. Only the Europe & Central Asia has experienced a slight increase of its expenditure on education as a percentage of total government (0.85%).

Here are some meaningful insights that can be gleaned from this graph:

-   The decline in expenditure on education as a percentage of total government expenditure is a worrying trend, as it suggests that governments are prioritizing other sectors over education. This could have negative consequences for the long-term development of these countries, as education is essential for economic growth and social progress.

-   The COVID-19 pandemic may have had an impact on the decline in expenditure on education, as governments have been forced to spend more on healthcare and other essential services. However, it is also possible that the decline was due to other factors, such as austerity measures or a lack of political commitment to education.

-   The fact that only **Europe & Central Asia** experienced an increase in expenditure on education as a percentage of total government expenditure suggests that this region is more committed to education than other regions. This could be due to a number of factors, such as a strong cultural emphasis on education or a belief that education is essential for economic competitiveness.

It is important to note that this graph only shows the median values for each region. This means that there is a lot of variation within each region. For example, some countries may have increased their expenditure on education as a percentage of total government expenditure, even though the median value for their region has declined.

Overall, this graph is a worrying sign that education is being neglected by many governments. It is important to remember that education is an essential investment for the future, and governments should be doing more to support it.
0.2.0.0.4 Source : http://sdg4-data.uis.unesco.org/

The line graph above shows the median value trends of the expenditure on education as a percentage of total government expenditure (%) for different Income groups from 2015 to 2022.

  • The cross-regional expenditure on education as a percentage of total government (%) has declined by 2.1 percentage points between 2016 and 2022. This suggests that education is being given a lower priority than other sectors, such as health or infrastructure etc.
  • The decline in education spending has been most pronounced in Lower middle income countries. This could be due to a number of factors, such as these countries have been disproportionately affected by the COVID-19 pandemic or having weaker economic growth.
  • The decline in education spending is more pronounced after 2018. This suggests that the COVID-19 pandemic might has had a significant impact on education spending.
  • The expenditure on education as a percentage of total government expenditure (%) is an indicator of the SDGs 4 to appreciate the priority given by countries to education. The decline in education spending suggests that countries are not giving education the priority it deserves.
Here are some of the important figures from the graph:

-   The cross-regional median expenditure on education as a percentage of total government expenditure (%) in 2015 was 15.9%.
-   The cross-regional median expenditure on education as a percentage of total government expenditure (%) in 2022 was 13.8%.
-   The largest decline in education spending was in Lower middle income countries, where the median expenditure fell from 16.3% in 2016 to 13.1% in 2022.

Overall, the graph shows that education spending is declining as a percentage of total government expenditure. This is a worrying trend, as education is essential for economic development and poverty reduction. The COVID-19 pandemic has exacerbated this trend, and it is important that countries take steps to increase education spending in order to meet the SDGs 4.

Here are some additional thoughts on the graph:

-   It is important to note that the graph only shows median values. This means that there is a lot of variation in education spending between countries within each income group.
-   The graph does not show the reasons for the decline in education spending. More research is needed to understand why education spending is declining and what can be done to reverse this trend.

0.3 Analysis of Government expenditure on education as a percentage of GDP (%)

0.3.0.0.2 Source : http://sdg4-data.uis.unesco.org/

The line graph above shows the median value trends of the government expenditure on education as percentage of GDP for different region from 2015 to 2022.

  • Overall downward trend: The cross-regional median value decreased from 4.6% in 2015 to 3.2% in 2022. This means that government spending on education as a percentage of GDP has declined globally.
  • Regional variations: The decline has been most pronounced in North America and the Middle East & North Africa, with decreases of 1.7% and 1.6% points, respectively. Europe & Central Asia is the only region that has seen a slight increase (0.4% points).
  • Education 2030 FFA target: In 2022, all regions except Europe & Central Asia fell below the 4% Education 2030 FFA target for government expenditure on education as a percentage of GDP. The cross-regional median value was 3.2%, which is significantly below the target.
  • Possible impact of COVID-19: The downward trend began in 2016 and became more pronounced after 2019. This suggests that the COVID-19 pandemic may have had a significant impact on government spending on education.
  • Sub-Saharan Africa: This region has consistently fallen below the 4% Education 2030 FFA target, despite a slight increase between 2015 and 2020.
  • South Asia: This region reached the 4% target in 2020 after a significant upward trend, but has since fallen back below the target in 2021 and 2022, with a particularly sharp decline in 2022.
Here are some additional important figures to note:

* The median government expenditure on education as a percentage of GDP in 2022 was 3.2%.
* The Education 2030 FFA target is 4%.
* The largest decline in government expenditure on education as a percentage of GDP was in North America (1.7% points).
* The only region to increase its government expenditure on education as a percentage of GDP was Europe & Central Asia (0.4% points).

Overall, the graph shows a concerning trend of declining government spending on education across most regions. The COVID-19 pandemic may have played a role in this decline, but further research is needed to determine the full extent of its impact.
0.3.0.0.4 Source : http://sdg4-data.uis.unesco.org/

The line graph above shows the median value trends of the government expenditure on education as percentage of GDP for different Income groups from 2015 to 2022.

Overall downward trend:

  • The median government expenditure on education as a percentage of GDP has declined from 4.4% in 2015 to 3.6% in 2022. This means that education is getting a smaller share of government budgets across the globe.
  • This decline is particularly concerning because education is crucial for economic development, poverty reduction, and social progress.

Regional variations:

  • The decline has been most pronounced in high-income countries, with a decrease of 1.1 percentage points since 2015. This is surprising, as these countries tend to have more resources available for education.
  • Upper-middle-income countries are the only ones that still meet the Education 2030 FFA target of 4% spending on education.
  • Low-income countries have consistently fallen below the target, despite a small increase between 2015 and 2021. However, their spending has also fallen back below 2015 levels since 2022.

Possible impact of COVID-19:

  • The downward trend in education spending began in 2016 and became more pronounced after 2019. This coincides with the COVID-19 pandemic, suggesting that it may have played a significant role in the decline.
  • Governments may have been forced to cut education spending to deal with the economic and health challenges of the pandemic.

Important figures:

  • The median government expenditure on education as a percentage of GDP in 2022 was 3.6%.
  • The Education 2030 FFA target is 4%.
  • The largest decline in government expenditure on education as a percentage of GDP was in high-income countries (1.1 percentage points).

Call to action:

This downward trend in education spending is alarming and needs to be reversed. Governments should prioritize education spending and ensure that it meets the Education 2030 FFA target provided we are almost in half way. This will require investing more resources in education, even in the face of other challenges. Investing in education is not just an expense; it is an investment in the future.

0.4 Analysis of the out-of-school rate for children of primary school age, both sexes (%)

0.4.0.0.1 Figure 5: Median value of the out-of-school rate for children of primary school age for different region from 2015 to 2022.
0.4.0.0.2 Source : http://sdg4-data.uis.unesco.org/

The line graph above shows the median value trends of the Out-of-school rate for children of primary school age, both sexes for different region from 2015 to 2022.

Here are some of the key insights we can glean from this data:

  • Overall increase in out-of-school children: The cross-regional median value increased from 2.6% in 2015 to 4.4% in 2022, exceeding the Education 2030 FFA target of 0%. This means that on average, more children are out of school now than in 2015.
  • Disparities between regions: The increase has been most pronounced in Sub-Saharan Africa, where the median value increased by 3.1 percentage points between 2015 and 2022. The gap between the target and Sub-Saharan Africa’s value in 2021 is a significant 18.4 percentage points.
  • The Sub-Saharan African, South Asia and Latin America & Caribbean regions have consistently evolded overhead the cross-regional median value. This suggests that these regions are not making progress towards achieving universal primary education.
  • Potential causes: The COVID-19 pandemic may have played a role in this increase, as many schools were closed during the pandemic. However, other factors, such as poverty or conflict, may also have contributed.
  • Importance of education: Education is essential for economic development and poverty reduction. The increasing out-of-school rate is a worrying trend that could have negative consequences for these regions in the long term.

Here are some additional thoughts on the data:

  • The graph only shows the median values for each region. It would be interesting to see the full range of data for each region to get a better sense of the variability within each region.
  • The graph does not provide any information on the reasons why children are out of school. It would be helpful to have more data on this to better understand the problem and develop effective interventions.
  • Despite the overall increase, there may be some regions or countries that are making progress in reducing their out-of-school rates. It is important to identify and share best practices from these success stories.

Overall, the line graph highlights a serious problem that needs to be addressed. More research is needed to understand the causes of the increase in out-of-school children, and effective interventions are needed to get more children back into school.

0.4.0.0.3 Figure 6: Median value of the out-of-school rate for children of primary school age for different Income groups from 2015 to 2022.
0.4.0.0.4 Source : http://sdg4-data.uis.unesco.org/

The line graph above shows the median value trends of the out-of-school rate for children of primary school age for different Income groups from 2015 to 2022.

Here are some of the key insights we can glean from this data:

  • Overall increase in out-of-school children: The median value increased from 4.8% in 2015 to 5.5% in 2022, exceeding the Education 2030 FFA target of 0%. This means that on average, more children are out of school now than in 2015.
  • Disparities between income groups: The increase has been most pronounced in low-income countries, where the median value increased by 3.1 percentage points between 2015 and 2022. The gap between the target and low income countries’ value in 2021 is a significant 24.8 percentage points.
  • Potential causes: The COVID-19 pandemic may have played a role in this increase, as many schools were closed during the pandemic. However, other factors, such as poverty or conflict, may also have contributed.
  • Importance of education: Education is essential for economic development and poverty reduction. The increasing out-of-school rate is a worrying trend that could have negative consequences for these regions in the long term.

Here are some additional thoughts on the data:

  • The graph only shows the median values for each region. It would be interesting to see the full range of data for each region to get a better sense of the variability within each region.
  • The graph does not provide any information on the reasons why children are out of school. It would be helpful to have more data on this to better understand the problem and develop effective interventions.
  • Despite the overall increase, there may be some regions or countries that are making progress in reducing their out-of-school rates. It is important to identify and share best practices from these success stories.

Overall, the line graph highlights a serious problem that needs to be addressed. More research is needed to understand the causes of the increase in out-of-school children, and effective interventions are needed to get more children back into school.

0.5 Analysis of the Completion rate, primary education, both sexes (%)

0.5.0.0.1 Figure 7: Median value trend of the ompletion rate, primary education, for different region from 2015 to 2022.
0.5.0.0.3 Figure 8: Median value trend of the ompletion rate, primary education, for different Income groups from 2015 to 2022.

0.6 Analysis of the Net enrolment rate, early childhood education, both sexes (%)

0.6.0.0.1 Figure 9: Median value trend of the Net enrolment rate, early childhood education, for different region from 2015 to 2022.
0.6.0.0.3 Figure 10: Median value trend of the Net enrolment rate, early childhood education, for different Income groups from 2015 to 2022.

0.7 Analysis of the Net enrolment rate, pre-primary, both sexes (%)

0.7.0.0.1 Figure 11: Median value trend of the Net enrolment rate, pre-primary, for different region from 2015 to 2022.
0.7.0.0.3 Figure 12: Median value trend of the Net enrolment rate, pre-primary, for different Income groups from 2015 to 2022.
LS0tDQp0aXRsZTogIkVkdWNhdGlvbiBFeHBlbmRpdHVyZSBBbmFseXNpcyINCkF1dGhvcjogQU1SIElOVEVSTkFUSU9OQUwNCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgdGhlbWU6IHVuaXRlZA0KICAgIGhpZ2hsaWdodDogdGFuZ28NCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQ0KICAgIGtlZXBfbWQ6IHRydWUNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIGNzczogc3R5bGUuY3NzDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICBvZmZpY2Vkb3duOjpyZG9jeF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCi0tLQ0KDQpUaGlzIGlzIGEgcXVpY2sgdmlldyBvZiB0aGUgZWR1Y2F0aW9uIGV4cGVuZGl0dXJlIGFjcm9zcyB0aGUgZ2xvYmUuIFdlIHRyeSB0byBzZWUgd2hlcmUgd2Ugc2VhdCBiZXR3ZWVuIHNvbWUgYW1iaXRpb3VzIGdvYWxzIG9mIHRoZSBTREcgNCB3ZSd2ZSBwbGFubmVkIHRvIGFjaGlldmUgaW4gMjAzMCBhbmQgd2hlcmUgd2Ugd2VyZSBpbiAyMDE1Lg0KDQojIyBMb2FkaW5nIGRhdGENCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9VFJVRSwgZWNobz1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShwbG90bHkpDQpkZjEgPC0gcmVhZHhsOjpyZWFkX2V4Y2VsKCJkYXRhL1NER19TZXB0MjAyM19sb25nLnhsc3giKQ0KZGYxIDwtIGRmMSB8Pg0KICAjbXV0YXRlKFllYXIgPSBhc19kYXRlKFllYXIpKSB8Pg0KICBhc190aWJibGUoKQ0KZGYyIDwtIHJlYWR4bDo6cmVhZF9leGNlbCgiZGF0YS9lY29ub215LWNsYXNzLnhsc3giKQ0KZGYyIDwtIGRmMiB8Pg0KICBhc190aWJibGUoKQ0KDQpkZiA8LSBpbm5lcl9qb2luKGRmMSwgZGYyLCBieSA9ICJDb3VudHJ5IikNCm9wZW54bHN4Ojp3cml0ZS54bHN4KGRmLCAiZGF0YS90aWR5L2VkdWV4cF9kZi54bHN4IikNCmRmIHw+DQogIGhlYWQoKSB8Pg0KICBrbml0cjo6a2FibGUoKQ0KYGBgDQoNCiMjIEFuYWx5c2lzIG9mIHRoZSBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24gYXMgYSBwZXJjZW50YWdlIG9mIHRvdGFsIGdvdmVybm1lbnQgZXhwZW5kaXR1cmUgKCUpDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PVRSVUUsIGVjaG89RkFMU0V9DQplZHVjZXhwX2RmIDwtIGRmIHw+DQogIGZpbHRlcigNCiAgICBZZWFyICVpbiUgc2VxKDIwMTUsIDIwMjIpLA0KICAgIGBJbmRpY2F0b3IgTmFtZWAgPT0gIkV4cGVuZGl0dXJlIG9uIGVkdWNhdGlvbiBhcyBhIHBlcmNlbnRhZ2Ugb2YgdG90YWwgZ292ZXJubWVudCBleHBlbmRpdHVyZSAoJSkiDQogICkgDQpvcGVueGxzeDo6d3JpdGUueGxzeChlZHVjZXhwX2RmLCAiZGF0YS90aWR5L2VkdWNleHBfZGYueGxzeCIpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9VFJVRSwgZWNobz1GQUxTRX0NCnJlZ2VkdWNleHBfZGYgPC0gZWR1Y2V4cF9kZiB8Pg0KICBncm91cF9ieShyZWdpb24sIFllYXIpIHw+DQogIHN1bW1hcml6ZShtZWRpYW5fdmFsdWUgPSBtZWRpYW4oVmFsdWUpKSAjfD4NCiAgIyBtdXRhdGUodGFyZ2V0ID0gNCkNCiN2aWV3KHJlZ2VkdWNleHBfZGYpDQpvcGVueGxzeDo6d3JpdGUueGxzeChyZWdlZHVjZXhwX2RmLCAiZGF0YS90aWR5L3JlZ2VkdWNleHBfZGYueGxzeCIpDQojZ2xpbXBzZShyZWdlZHVjZXhwX2RmKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PVRSVUUsIGVjaG89RkFMU0V9DQpyZWdtZWRpYW4gPC0gcmVnZWR1Y2V4cF9kZiB8Pg0KICBncm91cF9ieShZZWFyKSB8Pg0KICBzdW1tYXJpemUoY3Jvc3NyZWdtZWQgPSBtZWRpYW4obWVkaWFuX3ZhbHVlKSkNCmBgYA0KDQojIyMjIyAqKkZpZ3VyZSAxOioqIE1lZGlhbiB2YWx1ZSB0cmVuZHMgb2YgdGhlIGV4cGVuZGl0dXJlIG9uIGVkdWNhdGlvbiBhcyBhIHBlcmNlbnRhZ2Ugb2YgdG90YWwgZ292ZXJubWVudCBleHBlbmRpdHVyZSAoJSkgZm9yIGRpZmZlcmVudCByZWdpb24gZnJvbSAyMDE1IHRvIDIwMjIuDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aCA9IDkuNSwgZmlnLmhlaWdodCA9IDYsIG91dC53aWR0aD0gIjEwMCUifQ0KZ2dwbG90bHkoDQogIGdncGxvdCgNCiAgICByZWdlZHVjZXhwX2RmLA0KICAgIGFlcygNCiAgICAgIHggPSBZZWFyLA0KICAgICAgeSA9IG1lZGlhbl92YWx1ZSwNCiAgICAgIGNvbG9yID0gcmVnaW9uLA0KICAgICAgIyBsaW5ldHlwZSA9IHJlZ2lvbg0KICAgICkNCiAgKSArDQogICAgZ2VvbV9saW5lKHNpemUgPSAuOSkgKw0KICAgIGdlb21fbGluZSgNCiAgICAgIGRhdGEgPSByZWdtZWRpYW4sDQogICAgICBhZXMoeCA9IFllYXIsIHkgPSBjcm9zc3JlZ21lZCksDQogICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiLA0KICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgc2l6ZSA9IDENCiAgICApICsNCiAgICAgZ2VvbV90ZXh0KA0KICAgICAgYWVzKHggPSAyMDE5LCB5ID0gMCwgbGFiZWwgPSAi4pagIOKWoCDilqAgQ3Jvc3MtcmVnaW9uYWwgbWVkaWFuIHZhbHVlIiksIA0KICAgICAgaGp1c3QgPSAwLjUsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiYmxhY2siDQogICAgKSArDQogICAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheSIpKSArDQogICAgIHNjYWxlX2NvbG9yX21hbnVhbCgNCiAgICAgIHZhbHVlcyA9IGMoDQogICAgICAgICJkb2RnZXJibHVlIiwgIm9yYW5nZTMiLCAicHVycGxlMyIsICJicm93bjMiLCAiZGFya2JsdWUiLCAiZGFya2dyZWVuIiwgICJwaW5rMSINCiAgICAgICkNCiAgICApICsNCiAgICBsYWJzKA0KICAgICAgI3RpdGxlID0gIlNtb290aCBMaW5lIFBsb3Qgd2l0aCBMZWdlbmQgYW5kIE1hcmtlcnMiLA0KICAgICAgeCA9ICJZZWFyIiwNCiAgICAgIHkgPSAiTWVkaWFuIFZhbHVlIg0KICAgICkNCikNCmBgYA0KDQojIyMjIyAqKlNvdXJjZSA6IDxodHRwOi8vc2RnNC1kYXRhLnVpcy51bmVzY28ub3JnLz4qKg0KDQpUaGUgZ3JhcGggYWJvdmUgc2hvd3MgdGhlIG1lZGlhbiB2YWx1ZSB0cmVuZHMgb2YgdGhlICoqZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uIGFzIGEgcGVyY2VudGFnZSBvZiB0b3RhbCBnb3Zlcm5tZW50IGV4cGVuZGl0dXJlICglKSoqIGZvciBkaWZmZXJlbnQgcmVnaW9ucyBmcm9tIDIwMTUgdG8gMjAyMi4gVGhlIHRyZW5kIGhhcyBiZWVuIGFuIG92ZXJhbGwgZmFsbCBkb3duLiBUaGUgY3Jvc3MtcmVnaW9uYWwgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uIGFzIGEgcGVyY2VudGFnZSBvZiB0b3RhbCBnb3Zlcm5tZW50ICglKSBoYXMgZGltaW5pc2hlZCBieSAqKjMuNSUqKiBwb2ludHMgYmV0d2VlbiAyMDE2IGFuZCAyMDIyIHNob3dpbmcgdGhhdCBwcmlvcml0aWVzIGFyZSBiZWluZyBnaXZlbiB0byBvdGhlcnMgc2VjdG9yIGF0IHRoZSBzcGVuZCBvZiB0aGUgZWR1Y2F0aW9uIG9uZS4gVGhlIGRlY2xpbmUgaGFzIGJlZW4gbW9zdCBwcm9ub3VuY2VkIGluICoqRWFzdCBBc2lhICYgUGFjaWZpYyoqIGFuZCAqKk1pZGRsZSBFYXN0ICYgTm9ydGggQWZyaWNhKiouIE9ubHkgdGhlICoqRXVyb3BlICYgQ2VudHJhbCBBc2lhKiogaGFzIGV4cGVyaWVuY2VkIGEgc2xpZ2h0IGluY3JlYXNlIG9mIGl0cyBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24gYXMgYSBwZXJjZW50YWdlIG9mIHRvdGFsIGdvdmVybm1lbnQgKiooMC44NSUpKiouDQoNCmBgYCAgICAgICAgIA0KSGVyZSBhcmUgc29tZSBtZWFuaW5nZnVsIGluc2lnaHRzIHRoYXQgY2FuIGJlIGdsZWFuZWQgZnJvbSB0aGlzIGdyYXBoOg0KDQotICAgVGhlIGRlY2xpbmUgaW4gZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uIGFzIGEgcGVyY2VudGFnZSBvZiB0b3RhbCBnb3Zlcm5tZW50IGV4cGVuZGl0dXJlIGlzIGEgd29ycnlpbmcgdHJlbmQsIGFzIGl0IHN1Z2dlc3RzIHRoYXQgZ292ZXJubWVudHMgYXJlIHByaW9yaXRpemluZyBvdGhlciBzZWN0b3JzIG92ZXIgZWR1Y2F0aW9uLiBUaGlzIGNvdWxkIGhhdmUgbmVnYXRpdmUgY29uc2VxdWVuY2VzIGZvciB0aGUgbG9uZy10ZXJtIGRldmVsb3BtZW50IG9mIHRoZXNlIGNvdW50cmllcywgYXMgZWR1Y2F0aW9uIGlzIGVzc2VudGlhbCBmb3IgZWNvbm9taWMgZ3Jvd3RoIGFuZCBzb2NpYWwgcHJvZ3Jlc3MuDQoNCi0gICBUaGUgQ09WSUQtMTkgcGFuZGVtaWMgbWF5IGhhdmUgaGFkIGFuIGltcGFjdCBvbiB0aGUgZGVjbGluZSBpbiBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24sIGFzIGdvdmVybm1lbnRzIGhhdmUgYmVlbiBmb3JjZWQgdG8gc3BlbmQgbW9yZSBvbiBoZWFsdGhjYXJlIGFuZCBvdGhlciBlc3NlbnRpYWwgc2VydmljZXMuIEhvd2V2ZXIsIGl0IGlzIGFsc28gcG9zc2libGUgdGhhdCB0aGUgZGVjbGluZSB3YXMgZHVlIHRvIG90aGVyIGZhY3RvcnMsIHN1Y2ggYXMgYXVzdGVyaXR5IG1lYXN1cmVzIG9yIGEgbGFjayBvZiBwb2xpdGljYWwgY29tbWl0bWVudCB0byBlZHVjYXRpb24uDQoNCi0gICBUaGUgZmFjdCB0aGF0IG9ubHkgKipFdXJvcGUgJiBDZW50cmFsIEFzaWEqKiBleHBlcmllbmNlZCBhbiBpbmNyZWFzZSBpbiBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24gYXMgYSBwZXJjZW50YWdlIG9mIHRvdGFsIGdvdmVybm1lbnQgZXhwZW5kaXR1cmUgc3VnZ2VzdHMgdGhhdCB0aGlzIHJlZ2lvbiBpcyBtb3JlIGNvbW1pdHRlZCB0byBlZHVjYXRpb24gdGhhbiBvdGhlciByZWdpb25zLiBUaGlzIGNvdWxkIGJlIGR1ZSB0byBhIG51bWJlciBvZiBmYWN0b3JzLCBzdWNoIGFzIGEgc3Ryb25nIGN1bHR1cmFsIGVtcGhhc2lzIG9uIGVkdWNhdGlvbiBvciBhIGJlbGllZiB0aGF0IGVkdWNhdGlvbiBpcyBlc3NlbnRpYWwgZm9yIGVjb25vbWljIGNvbXBldGl0aXZlbmVzcy4NCg0KSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGlzIGdyYXBoIG9ubHkgc2hvd3MgdGhlIG1lZGlhbiB2YWx1ZXMgZm9yIGVhY2ggcmVnaW9uLiBUaGlzIG1lYW5zIHRoYXQgdGhlcmUgaXMgYSBsb3Qgb2YgdmFyaWF0aW9uIHdpdGhpbiBlYWNoIHJlZ2lvbi4gRm9yIGV4YW1wbGUsIHNvbWUgY291bnRyaWVzIG1heSBoYXZlIGluY3JlYXNlZCB0aGVpciBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24gYXMgYSBwZXJjZW50YWdlIG9mIHRvdGFsIGdvdmVybm1lbnQgZXhwZW5kaXR1cmUsIGV2ZW4gdGhvdWdoIHRoZSBtZWRpYW4gdmFsdWUgZm9yIHRoZWlyIHJlZ2lvbiBoYXMgZGVjbGluZWQuDQoNCk92ZXJhbGwsIHRoaXMgZ3JhcGggaXMgYSB3b3JyeWluZyBzaWduIHRoYXQgZWR1Y2F0aW9uIGlzIGJlaW5nIG5lZ2xlY3RlZCBieSBtYW55IGdvdmVybm1lbnRzLiBJdCBpcyBpbXBvcnRhbnQgdG8gcmVtZW1iZXIgdGhhdCBlZHVjYXRpb24gaXMgYW4gZXNzZW50aWFsIGludmVzdG1lbnQgZm9yIHRoZSBmdXR1cmUsIGFuZCBnb3Zlcm5tZW50cyBzaG91bGQgYmUgZG9pbmcgbW9yZSB0byBzdXBwb3J0IGl0Lg0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PVRSVUUsIGVjaG89RkFMU0V9DQplY296ZWR1Y2V4cF9kZiA8LSBlZHVjZXhwX2RmIHw+DQogIGdyb3VwX2J5KGBJbmNvbWUgZ3JvdXBgLCBZZWFyKSB8Pg0KICBzdW1tYXJpemUobWVkaWFuX3ZhbHVlID0gbWVkaWFuKFZhbHVlKSkgI3w+DQogICMgc2VsZWN0KFllYXIsIFJlZ2lvbiwgVmFsdWUpDQojdmlldyhlY296X2RmKQ0Kb3Blbnhsc3g6OndyaXRlLnhsc3goZWNvemVkdWNleHBfZGYsICJkYXRhL3RpZHkvZWNvemVkdWNleHBfZGYueGxzeCIpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQplY296bWVkaWFuIDwtIGVjb3plZHVjZXhwX2RmIHw+DQogIGdyb3VwX2J5KFllYXIpIHw+DQogIHN1bW1hcml6ZShjcm9zc2Vjb3ptZWQgPSBtZWRpYW4obWVkaWFuX3ZhbHVlKSkNCmBgYA0KDQojIyMjIyAqKkZpZ3VyZSAyOioqIE1lZGlhbiB2YWx1ZSB0cmVuZHMgb2YgdGhlIGV4cGVuZGl0dXJlIG9uIGVkdWNhdGlvbiBhcyBhIHBlcmNlbnRhZ2Ugb2YgdG90YWwgZ292ZXJubWVudCBleHBlbmRpdHVyZSAoJSkgZm9yIGRpZmZlcmVudCBJbmNvbWUgZ3JvdXBzIGZyb20gMjAxNSB0byAyMDIyLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGggPSA5LjUsIGZpZy5oZWlnaHQgPSA2LCBvdXQud2lkdGg9ICIxMDAlIn0NCmdncGxvdGx5KA0KICBnZ3Bsb3QoDQogICAgZWNvemVkdWNleHBfZGYsDQogICAgYWVzKA0KICAgICAgeCA9IFllYXIsDQogICAgICB5ID0gbWVkaWFuX3ZhbHVlLA0KICAgICAgY29sb3IgPSBgSW5jb21lIGdyb3VwYCwNCiAgICAgICMgbGluZXR5cGUgPSBgSW5jb21lIGdyb3VwYA0KICAgICkNCiAgKSArDQogICAgZ2VvbV9saW5lKHNpemUgPSAwLjkpICsNCiAgICBnZW9tX2xpbmUoDQogICAgICBkYXRhID0gZWNvem1lZGlhbiwNCiAgICAgIGFlcyh4ID0gWWVhciwgeSA9IGNyb3NzZWNvem1lZCksDQogICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiLA0KICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgc2l6ZSA9IDENCiAgICApICsNCiAgICAgZ2VvbV90ZXh0KA0KICAgICAgYWVzKHggPSAyMDE5LCB5ID0gMCwgbGFiZWwgPSAi4pagIOKWoCDilqAgQ3Jvc3MtaW5jb21lIGdyb3VwIG1lZGlhbiB2YWx1ZSIpLCANCiAgICAgIGhqdXN0ID0gMC41LCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImJsYWNrIg0KICAgICkgKw0KICAgIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImdyYXkiKSkgKw0KICAgIHNjYWxlX2NvbG9yX21hbnVhbCgNCiAgICAgIHZhbHVlcyA9IGMoDQogICAgICAgICJkYXJrYmx1ZSIsICJvcmFuZ2UzIiwgInB1cnBsZTMiLCAiZGFya2dyZWVuIiwgImJyb3duIg0KICAgICAgKQ0KICAgICkgKw0KICAgIGxhYnMoDQogICAgICAjdGl0bGUgPSAiU21vb3RoIExpbmUgUGxvdCB3aXRoIExlZ2VuZCBhbmQgTWFya2VycyIsDQogICAgICB4ID0gIlllYXIiLA0KICAgICAgeSA9ICJNZWRpYW4gVmFsdWUiDQogICAgKQ0KKQ0KYGBgDQoNCiMjIyMjICoqU291cmNlIDogPGh0dHA6Ly9zZGc0LWRhdGEudWlzLnVuZXNjby5vcmcvPioqDQoNCioqVGhlIGxpbmUgZ3JhcGggYWJvdmUgc2hvd3MgdGhlIG1lZGlhbiB2YWx1ZSB0cmVuZHMgb2YgdGhlIGV4cGVuZGl0dXJlIG9uIGVkdWNhdGlvbiBhcyBhIHBlcmNlbnRhZ2Ugb2YgdG90YWwgZ292ZXJubWVudCBleHBlbmRpdHVyZSAoJSkgZm9yIGRpZmZlcmVudCBJbmNvbWUgZ3JvdXBzIGZyb20gMjAxNSB0byAyMDIyLioqDQoNCi0gICBUaGUgY3Jvc3MtcmVnaW9uYWwgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uIGFzIGEgcGVyY2VudGFnZSBvZiB0b3RhbCBnb3Zlcm5tZW50ICglKSBoYXMgZGVjbGluZWQgYnkgKioyLjEqKiBwZXJjZW50YWdlIHBvaW50cyBiZXR3ZWVuIDIwMTYgYW5kIDIwMjIuIFRoaXMgc3VnZ2VzdHMgdGhhdCBlZHVjYXRpb24gaXMgYmVpbmcgZ2l2ZW4gYSBsb3dlciBwcmlvcml0eSB0aGFuIG90aGVyIHNlY3RvcnMsIHN1Y2ggYXMgaGVhbHRoIG9yIGluZnJhc3RydWN0dXJlIGV0Yy4NCi0gICBUaGUgZGVjbGluZSBpbiBlZHVjYXRpb24gc3BlbmRpbmcgaGFzIGJlZW4gbW9zdCBwcm9ub3VuY2VkIGluIExvd2VyIG1pZGRsZSBpbmNvbWUgY291bnRyaWVzLiBUaGlzIGNvdWxkIGJlIGR1ZSB0byBhIG51bWJlciBvZiBmYWN0b3JzLCBzdWNoIGFzIHRoZXNlIGNvdW50cmllcyBoYXZlIGJlZW4gZGlzcHJvcG9ydGlvbmF0ZWx5IGFmZmVjdGVkIGJ5IHRoZSBDT1ZJRC0xOSBwYW5kZW1pYyBvciBoYXZpbmcgd2Vha2VyIGVjb25vbWljIGdyb3d0aC4NCi0gICBUaGUgZGVjbGluZSBpbiBlZHVjYXRpb24gc3BlbmRpbmcgaXMgbW9yZSBwcm9ub3VuY2VkIGFmdGVyIDIwMTguIFRoaXMgc3VnZ2VzdHMgdGhhdCB0aGUgQ09WSUQtMTkgcGFuZGVtaWMgbWlnaHQgaGFzIGhhZCBhIHNpZ25pZmljYW50IGltcGFjdCBvbiBlZHVjYXRpb24gc3BlbmRpbmcuDQotICAgVGhlIGV4cGVuZGl0dXJlIG9uIGVkdWNhdGlvbiBhcyBhIHBlcmNlbnRhZ2Ugb2YgdG90YWwgZ292ZXJubWVudCBleHBlbmRpdHVyZSAoJSkgaXMgYW4gaW5kaWNhdG9yIG9mIHRoZSBTREdzIDQgdG8gYXBwcmVjaWF0ZSB0aGUgcHJpb3JpdHkgZ2l2ZW4gYnkgY291bnRyaWVzIHRvIGVkdWNhdGlvbi4gVGhlIGRlY2xpbmUgaW4gZWR1Y2F0aW9uIHNwZW5kaW5nIHN1Z2dlc3RzIHRoYXQgY291bnRyaWVzIGFyZSBub3QgZ2l2aW5nIGVkdWNhdGlvbiB0aGUgcHJpb3JpdHkgaXQgZGVzZXJ2ZXMuDQoNCmBgYCAgICAgICAgIA0KSGVyZSBhcmUgc29tZSBvZiB0aGUgaW1wb3J0YW50IGZpZ3VyZXMgZnJvbSB0aGUgZ3JhcGg6DQoNCi0gICBUaGUgY3Jvc3MtcmVnaW9uYWwgbWVkaWFuIGV4cGVuZGl0dXJlIG9uIGVkdWNhdGlvbiBhcyBhIHBlcmNlbnRhZ2Ugb2YgdG90YWwgZ292ZXJubWVudCBleHBlbmRpdHVyZSAoJSkgaW4gMjAxNSB3YXMgMTUuOSUuDQotICAgVGhlIGNyb3NzLXJlZ2lvbmFsIG1lZGlhbiBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24gYXMgYSBwZXJjZW50YWdlIG9mIHRvdGFsIGdvdmVybm1lbnQgZXhwZW5kaXR1cmUgKCUpIGluIDIwMjIgd2FzIDEzLjglLg0KLSAgIFRoZSBsYXJnZXN0IGRlY2xpbmUgaW4gZWR1Y2F0aW9uIHNwZW5kaW5nIHdhcyBpbiBMb3dlciBtaWRkbGUgaW5jb21lIGNvdW50cmllcywgd2hlcmUgdGhlIG1lZGlhbiBleHBlbmRpdHVyZSBmZWxsIGZyb20gMTYuMyUgaW4gMjAxNiB0byAxMy4xJSBpbiAyMDIyLg0KDQpPdmVyYWxsLCB0aGUgZ3JhcGggc2hvd3MgdGhhdCBlZHVjYXRpb24gc3BlbmRpbmcgaXMgZGVjbGluaW5nIGFzIGEgcGVyY2VudGFnZSBvZiB0b3RhbCBnb3Zlcm5tZW50IGV4cGVuZGl0dXJlLiBUaGlzIGlzIGEgd29ycnlpbmcgdHJlbmQsIGFzIGVkdWNhdGlvbiBpcyBlc3NlbnRpYWwgZm9yIGVjb25vbWljIGRldmVsb3BtZW50IGFuZCBwb3ZlcnR5IHJlZHVjdGlvbi4gVGhlIENPVklELTE5IHBhbmRlbWljIGhhcyBleGFjZXJiYXRlZCB0aGlzIHRyZW5kLCBhbmQgaXQgaXMgaW1wb3J0YW50IHRoYXQgY291bnRyaWVzIHRha2Ugc3RlcHMgdG8gaW5jcmVhc2UgZWR1Y2F0aW9uIHNwZW5kaW5nIGluIG9yZGVyIHRvIG1lZXQgdGhlIFNER3MgNC4NCg0KSGVyZSBhcmUgc29tZSBhZGRpdGlvbmFsIHRob3VnaHRzIG9uIHRoZSBncmFwaDoNCg0KLSAgIEl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIGdyYXBoIG9ubHkgc2hvd3MgbWVkaWFuIHZhbHVlcy4gVGhpcyBtZWFucyB0aGF0IHRoZXJlIGlzIGEgbG90IG9mIHZhcmlhdGlvbiBpbiBlZHVjYXRpb24gc3BlbmRpbmcgYmV0d2VlbiBjb3VudHJpZXMgd2l0aGluIGVhY2ggaW5jb21lIGdyb3VwLg0KLSAgIFRoZSBncmFwaCBkb2VzIG5vdCBzaG93IHRoZSByZWFzb25zIGZvciB0aGUgZGVjbGluZSBpbiBlZHVjYXRpb24gc3BlbmRpbmcuIE1vcmUgcmVzZWFyY2ggaXMgbmVlZGVkIHRvIHVuZGVyc3RhbmQgd2h5IGVkdWNhdGlvbiBzcGVuZGluZyBpcyBkZWNsaW5pbmcgYW5kIHdoYXQgY2FuIGJlIGRvbmUgdG8gcmV2ZXJzZSB0aGlzIHRyZW5kLg0KYGBgDQoNCiMjIEFuYWx5c2lzIG9mIEdvdmVybm1lbnQgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uIGFzIGEgcGVyY2VudGFnZSBvZiBHRFAgKCUpDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PVRSVUUsIGVjaG89RkFMU0V9DQpnb3ZleHBfZGYgPC0gZGYgfD4NCiAgZmlsdGVyKA0KICAgIFllYXIgJWluJSBzZXEoMjAxNSwgMjAyMiksDQogICAgYEluZGljYXRvciBOYW1lYCA9PSAiR292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24gYXMgYSBwZXJjZW50YWdlIG9mIEdEUCAoJSkiDQogICkNCm9wZW54bHN4Ojp3cml0ZS54bHN4KGdvdmV4cF9kZiwgImRhdGEvdGlkeS9nb3ZleHBfZGYueGxzeCIpDQojIGdsaW1wc2UoZ292ZXhwX2RmKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PVRSVUUsIGVjaG89RkFMU0V9DQpnb3ZleHByZWdfZGYgPC0gZ292ZXhwX2RmIHw+DQogIGdyb3VwX2J5KHJlZ2lvbiwgWWVhcikgfD4NCiAgc3VtbWFyaXplKG1lZGlhbl92YWx1ZSA9IG1lZGlhbihWYWx1ZSkpIHw+DQogIG11dGF0ZSh0YXJnZXQgPSA0KQ0KICAjIHNlbGVjdChZZWFyLCBSZWdpb24sIFZhbHVlKQ0KI3ZpZXcocmVnX2RmKQ0Kb3Blbnhsc3g6OndyaXRlLnhsc3goZ292ZXhwcmVnX2RmLCAiZGF0YS90aWR5L2dvdmV4cHJlZ19kZi54bHN4IikNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnJlZ21lZGlhbiA8LSBnb3ZleHByZWdfZGYgfD4NCiAgZ3JvdXBfYnkoWWVhcikgfD4NCiAgc3VtbWFyaXplKGNyb3NzcmVnbWVkID0gbWVkaWFuKG1lZGlhbl92YWx1ZSkpDQpgYGANCg0KIyMjIyMgKipGaWd1cmUgMzoqKiBNZWRpYW4gdmFsdWUgdHJlbmRzIG9mIHRoZSBnb3Zlcm5tZW50IGV4cGVuZGl0dXJlIG9uIGVkdWNhdGlvbiBhcyBwZXJjZW50YWdlIG9mIEdEUCBmb3IgZGlmZmVyZW50IHJlZ2lvbiBmcm9tIDIwMTUgdG8gMjAyMi4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoID0gOS41LCBmaWcuaGVpZ2h0ID0gNiwgb3V0LndpZHRoPSAiMTAwJSJ9DQpnZ3Bsb3RseSgNCiAgZ2dwbG90KA0KICAgIGdvdmV4cHJlZ19kZiwNCiAgICBhZXMoDQogICAgICB4ID0gWWVhciwNCiAgICAgIHkgPSBtZWRpYW5fdmFsdWUsDQogICAgICBjb2xvciA9IHJlZ2lvbg0KICAgICAgIyBsaW5ldHlwZSA9IHJlZ2lvbg0KICAgICkNCiAgKSArDQogICAgZ2VvbV9saW5lKHNpemUgPSAuOCkgKw0KICAgIGdlb21fbGluZSgNCiAgICAgIGRhdGEgPSByZWdtZWRpYW4sDQogICAgICBhZXMoeCA9IFllYXIsIHkgPSBjcm9zc3JlZ21lZCksDQogICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiLA0KICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgc2l6ZSA9IDENCiAgICApICsNCiAgICAgZ2VvbV90ZXh0KA0KICAgICAgYWVzKHggPSAyMDE4LCB5ID0gMC41LCBsYWJlbCA9ICLilqAg4pagIOKWoCBDcm9zcy1yZWdpb25hbCBtZWRpYW4gdmFsdWUiKSwNCiAgICAgIGhqdXN0ID0gMC41LCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImJsYWNrIg0KICAgICkgKw0KICAgIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImdyYXkiKSkgKw0KICAgIHNjYWxlX2NvbG9yX21hbnVhbCgNCiAgICAgIHZhbHVlcyA9IGMoDQogICAgICAgICJkb2RnZXJibHVlIiwgIm9yYW5nZTMiLCAicHVycGxlMyIsICJicm93bjQiLCAiZGFya2JsdWUiLCAiZGFya2dyZWVuIiwgICJwaW5rMyINCiAgICAgICkNCiAgICApICsNCiAgICBnZW9tX2xpbmUoDQogICAgICBhZXMoeCA9IFllYXIsIHkgPSB0YXJnZXQpLA0KICAgICAgY29sb3IgPSAicmVkIiwNCiAgICAgIHNpemUgPSAxLA0KICAgICAgbGluZXR5cGUgPSAiZG90dGVkIg0KICAgICkgKw0KICAgIGdlb21fdGV4dCgNCiAgICAgIGFlcyh4ID0gMjAxOCwgeSA9IDAsIGxhYmVsID0gIuKWoCDilqAg4pagIEVkdWNhdGlvbiAyMDMwIEZGQSBUYXJnZXQiKSwgDQogICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJyZWQiDQogICAgKSArDQogICAgIyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygpKSArDQogICAgbGFicygNCiAgICAgICN0aXRsZSA9ICJTbW9vdGggTGluZSBQbG90IHdpdGggTGVnZW5kIGFuZCBNYXJrZXJzIiwNCiAgICAgIHggPSAiWWVhciIsDQogICAgICB5ID0gIk1lZGlhbiBWYWx1ZSINCiAgICApDQopDQpgYGANCg0KIyMjIyMgKipTb3VyY2UgOiA8aHR0cDovL3NkZzQtZGF0YS51aXMudW5lc2NvLm9yZy8+KioNCg0KKipUaGUgbGluZSBncmFwaCBhYm92ZSBzaG93cyB0aGUgbWVkaWFuIHZhbHVlIHRyZW5kcyBvZiB0aGUgZ292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24gYXMgcGVyY2VudGFnZSBvZiBHRFAgZm9yIGRpZmZlcmVudCByZWdpb24gZnJvbSAyMDE1IHRvIDIwMjIuKioNCg0KLSAgICoqT3ZlcmFsbCBkb3dud2FyZCB0cmVuZDoqKiBUaGUgY3Jvc3MtcmVnaW9uYWwgbWVkaWFuIHZhbHVlIGRlY3JlYXNlZCBmcm9tIDQuNiUgaW4gMjAxNSB0byAzLjIlIGluIDIwMjIuIFRoaXMgbWVhbnMgdGhhdCBnb3Zlcm5tZW50IHNwZW5kaW5nIG9uIGVkdWNhdGlvbiBhcyBhIHBlcmNlbnRhZ2Ugb2YgR0RQIGhhcyBkZWNsaW5lZCBnbG9iYWxseS4NCi0gICAqKlJlZ2lvbmFsIHZhcmlhdGlvbnM6KiogVGhlIGRlY2xpbmUgaGFzIGJlZW4gbW9zdCBwcm9ub3VuY2VkIGluIE5vcnRoIEFtZXJpY2EgYW5kIHRoZSBNaWRkbGUgRWFzdCAmIE5vcnRoIEFmcmljYSwgd2l0aCBkZWNyZWFzZXMgb2YgMS43JSBhbmQgMS42JSBwb2ludHMsIHJlc3BlY3RpdmVseS4gRXVyb3BlICYgQ2VudHJhbCBBc2lhIGlzIHRoZSBvbmx5IHJlZ2lvbiB0aGF0IGhhcyBzZWVuIGEgc2xpZ2h0IGluY3JlYXNlICgwLjQlIHBvaW50cykuDQotICAgKipFZHVjYXRpb24gMjAzMCBGRkEgdGFyZ2V0OioqIEluIDIwMjIsIGFsbCByZWdpb25zIGV4Y2VwdCBFdXJvcGUgJiBDZW50cmFsIEFzaWEgZmVsbCBiZWxvdyB0aGUgNCUgRWR1Y2F0aW9uIDIwMzAgRkZBIHRhcmdldCBmb3IgZ292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24gYXMgYSBwZXJjZW50YWdlIG9mIEdEUC4gVGhlIGNyb3NzLXJlZ2lvbmFsIG1lZGlhbiB2YWx1ZSB3YXMgMy4yJSwgd2hpY2ggaXMgc2lnbmlmaWNhbnRseSBiZWxvdyB0aGUgdGFyZ2V0Lg0KLSAgICoqUG9zc2libGUgaW1wYWN0IG9mIENPVklELTE5OioqIFRoZSBkb3dud2FyZCB0cmVuZCBiZWdhbiBpbiAyMDE2IGFuZCBiZWNhbWUgbW9yZSBwcm9ub3VuY2VkIGFmdGVyIDIwMTkuIFRoaXMgc3VnZ2VzdHMgdGhhdCB0aGUgQ09WSUQtMTkgcGFuZGVtaWMgbWF5IGhhdmUgaGFkIGEgc2lnbmlmaWNhbnQgaW1wYWN0IG9uIGdvdmVybm1lbnQgc3BlbmRpbmcgb24gZWR1Y2F0aW9uLg0KLSAgICoqU3ViLVNhaGFyYW4gQWZyaWNhOioqIFRoaXMgcmVnaW9uIGhhcyBjb25zaXN0ZW50bHkgZmFsbGVuIGJlbG93IHRoZSA0JSBFZHVjYXRpb24gMjAzMCBGRkEgdGFyZ2V0LCBkZXNwaXRlIGEgc2xpZ2h0IGluY3JlYXNlIGJldHdlZW4gMjAxNSBhbmQgMjAyMC4NCi0gICAqKlNvdXRoIEFzaWE6KiogVGhpcyByZWdpb24gcmVhY2hlZCB0aGUgNCUgdGFyZ2V0IGluIDIwMjAgYWZ0ZXIgYSBzaWduaWZpY2FudCB1cHdhcmQgdHJlbmQsIGJ1dCBoYXMgc2luY2UgZmFsbGVuIGJhY2sgYmVsb3cgdGhlIHRhcmdldCBpbiAyMDIxIGFuZCAyMDIyLCB3aXRoIGEgcGFydGljdWxhcmx5IHNoYXJwIGRlY2xpbmUgaW4gMjAyMi4NCg0KYGBgICAgICAgICAgDQpIZXJlIGFyZSBzb21lIGFkZGl0aW9uYWwgaW1wb3J0YW50IGZpZ3VyZXMgdG8gbm90ZToNCg0KKiBUaGUgbWVkaWFuIGdvdmVybm1lbnQgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uIGFzIGEgcGVyY2VudGFnZSBvZiBHRFAgaW4gMjAyMiB3YXMgMy4yJS4NCiogVGhlIEVkdWNhdGlvbiAyMDMwIEZGQSB0YXJnZXQgaXMgNCUuDQoqIFRoZSBsYXJnZXN0IGRlY2xpbmUgaW4gZ292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24gYXMgYSBwZXJjZW50YWdlIG9mIEdEUCB3YXMgaW4gTm9ydGggQW1lcmljYSAoMS43JSBwb2ludHMpLg0KKiBUaGUgb25seSByZWdpb24gdG8gaW5jcmVhc2UgaXRzIGdvdmVybm1lbnQgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uIGFzIGEgcGVyY2VudGFnZSBvZiBHRFAgd2FzIEV1cm9wZSAmIENlbnRyYWwgQXNpYSAoMC40JSBwb2ludHMpLg0KDQpPdmVyYWxsLCB0aGUgZ3JhcGggc2hvd3MgYSBjb25jZXJuaW5nIHRyZW5kIG9mIGRlY2xpbmluZyBnb3Zlcm5tZW50IHNwZW5kaW5nIG9uIGVkdWNhdGlvbiBhY3Jvc3MgbW9zdCByZWdpb25zLiBUaGUgQ09WSUQtMTkgcGFuZGVtaWMgbWF5IGhhdmUgcGxheWVkIGEgcm9sZSBpbiB0aGlzIGRlY2xpbmUsIGJ1dCBmdXJ0aGVyIHJlc2VhcmNoIGlzIG5lZWRlZCB0byBkZXRlcm1pbmUgdGhlIGZ1bGwgZXh0ZW50IG9mIGl0cyBpbXBhY3QuDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9VFJVRSwgZWNobz1GQUxTRX0NCmVjb3pnb3ZleHBfZGYgPC0gZ292ZXhwX2RmIHw+DQogIGdyb3VwX2J5KGBJbmNvbWUgZ3JvdXBgLCBZZWFyKSB8Pg0KICBzdW1tYXJpemUobWVkaWFuX3ZhbHVlID0gbWVkaWFuKFZhbHVlKSkgfD4NCiAgbXV0YXRlKHRhcmdldCA9IDQpDQojdmlldyhlY296X2RmKQ0Kb3Blbnhsc3g6OndyaXRlLnhsc3goZWNvemdvdmV4cF9kZiwgImRhdGEvdGlkeS9lY296Z292ZXhwX2RmLnhsc3giKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KZWNvem1lZGlhbiA8LSBlY296Z292ZXhwX2RmIHw+DQogIGdyb3VwX2J5KFllYXIpIHw+DQogIHN1bW1hcml6ZShjcm9zc2Vjb3ptZWQgPSBtZWRpYW4obWVkaWFuX3ZhbHVlKSkNCiMgZWNvem1lZGlhbg0KYGBgDQoNCiMjIyMjICoqRmlndXJlIDQ6KiogTWVkaWFuIHZhbHVlIHRyZW5kcyBvZiB0aGUgZ292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24gYXMgcGVyY2VudGFnZSBvZiBHRFAgZm9yIGRpZmZlcmVudCBJbmNvbWUgZ3JvdXBzIGZyb20gMjAxNSB0byAyMDIyLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGggPSA5LjUsIGZpZy5oZWlnaHQgPSA2LCBvdXQud2lkdGg9ICIxMDAlIn0NCmdncGxvdGx5KA0KICBnZ3Bsb3QoDQogICAgZWNvemdvdmV4cF9kZiwNCiAgICBhZXMoDQogICAgICB4ID0gWWVhciwNCiAgICAgIHkgPSBtZWRpYW5fdmFsdWUsDQogICAgICBjb2xvciA9IGBJbmNvbWUgZ3JvdXBgDQogICAgKQ0KICApICsNCiAgICBnZW9tX2xpbmUoDQogICAgICBkYXRhID0gZWNvem1lZGlhbiwNCiAgICAgIGFlcyh4ID0gWWVhciwgeSA9IGNyb3NzZWNvem1lZCksDQogICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiLA0KICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgc2l6ZSA9IDENCiAgICApICsNCiAgICAgZ2VvbV90ZXh0KA0KICAgICAgYWVzKHggPSAyMDE4LCB5ID0gMCwgbGFiZWwgPSAi4pagIOKWoCDilqAgQ3Jvc3MtaW5jb21lIGdyb3VwIG1lZGlhbiB2YWx1ZSIpLCANCiAgICAgIGhqdXN0ID0gMC41LCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImJsYWNrIg0KICAgICkgKw0KICAgIGdlb21fbGluZShhZXMoKSwgc2l6ZSA9IDAuOCkgKw0KICAgICMgZ2VvbV9wb2ludChzaXplID0gMy41KSArDQogICAgZ2VvbV9saW5lKA0KICAgICAgYWVzKHggPSBZZWFyLCB5ID0gdGFyZ2V0KSwNCiAgICAgIGNvbG9yID0gInJlZCIsDQogICAgICBzaXplID0gMSwNCiAgICAgIGxpbmV0eXBlID0gImRvdHRlZCINCiAgICApICsNCiAgICBnZW9tX3RleHQoDQogICAgICBhZXMoeCA9IDIwMTgsIHkgPSAwLjUsIGxhYmVsID0gIuKWoCDilqAg4pagIEVkdWNhdGlvbiAyMDMwIEZGQSBUYXJnZXQiKSwgDQogICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJyZWQiDQogICAgKSArDQogICAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheSIpKSArDQogICAgc2NhbGVfY29sb3JfbWFudWFsKA0KICAgICAgdmFsdWVzID0gYygNCiAgICAgICAgImRhcmtibHVlIiwgIm9yYW5nZTMiLCAicHVycGxlMyIsICJyZWQ0IiwgImJyb3duIg0KICAgICAgKQ0KICAgICkgKw0KICAgIGxhYnMoDQogICAgICAjdGl0bGUgPSAiU21vb3RoIExpbmUgUGxvdCB3aXRoIExlZ2VuZCBhbmQgTWFya2VycyIsDQogICAgICB4ID0gIlllYXIiLA0KICAgICAgeSA9ICJNZWRpYW4gVmFsdWUiDQogICAgKQ0KKQ0KYGBgDQoNCiMjIyMjICoqU291cmNlIDogPGh0dHA6Ly9zZGc0LWRhdGEudWlzLnVuZXNjby5vcmcvPioqDQoNCioqVGhlIGxpbmUgZ3JhcGggYWJvdmUgc2hvd3MgdGhlIG1lZGlhbiB2YWx1ZSB0cmVuZHMgb2YgdGhlIGdvdmVybm1lbnQgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uIGFzIHBlcmNlbnRhZ2Ugb2YgR0RQIGZvciBkaWZmZXJlbnQgSW5jb21lIGdyb3VwcyBmcm9tIDIwMTUgdG8gMjAyMi4qKg0KDQoqKk92ZXJhbGwgZG93bndhcmQgdHJlbmQ6KioNCg0KLSAgIFRoZSBtZWRpYW4gZ292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24gYXMgYSBwZXJjZW50YWdlIG9mIEdEUCBoYXMgZGVjbGluZWQgZnJvbSA0LjQlIGluIDIwMTUgdG8gMy42JSBpbiAyMDIyLiBUaGlzIG1lYW5zIHRoYXQgZWR1Y2F0aW9uIGlzIGdldHRpbmcgYSBzbWFsbGVyIHNoYXJlIG9mIGdvdmVybm1lbnQgYnVkZ2V0cyBhY3Jvc3MgdGhlIGdsb2JlLg0KLSAgIFRoaXMgZGVjbGluZSBpcyBwYXJ0aWN1bGFybHkgY29uY2VybmluZyBiZWNhdXNlIGVkdWNhdGlvbiBpcyBjcnVjaWFsIGZvciBlY29ub21pYyBkZXZlbG9wbWVudCwgcG92ZXJ0eSByZWR1Y3Rpb24sIGFuZCBzb2NpYWwgcHJvZ3Jlc3MuDQoNCioqUmVnaW9uYWwgdmFyaWF0aW9uczoqKg0KDQotICAgVGhlIGRlY2xpbmUgaGFzIGJlZW4gbW9zdCBwcm9ub3VuY2VkIGluIGhpZ2gtaW5jb21lIGNvdW50cmllcywgd2l0aCBhIGRlY3JlYXNlIG9mIDEuMSBwZXJjZW50YWdlIHBvaW50cyBzaW5jZSAyMDE1LiBUaGlzIGlzIHN1cnByaXNpbmcsIGFzIHRoZXNlIGNvdW50cmllcyB0ZW5kIHRvIGhhdmUgbW9yZSByZXNvdXJjZXMgYXZhaWxhYmxlIGZvciBlZHVjYXRpb24uDQotICAgVXBwZXItbWlkZGxlLWluY29tZSBjb3VudHJpZXMgYXJlIHRoZSBvbmx5IG9uZXMgdGhhdCBzdGlsbCBtZWV0IHRoZSBFZHVjYXRpb24gMjAzMCBGRkEgdGFyZ2V0IG9mIDQlIHNwZW5kaW5nIG9uIGVkdWNhdGlvbi4NCi0gICBMb3ctaW5jb21lIGNvdW50cmllcyBoYXZlIGNvbnNpc3RlbnRseSBmYWxsZW4gYmVsb3cgdGhlIHRhcmdldCwgZGVzcGl0ZSBhIHNtYWxsIGluY3JlYXNlIGJldHdlZW4gMjAxNSBhbmQgMjAyMS4gSG93ZXZlciwgdGhlaXIgc3BlbmRpbmcgaGFzIGFsc28gZmFsbGVuIGJhY2sgYmVsb3cgMjAxNSBsZXZlbHMgc2luY2UgMjAyMi4NCg0KKipQb3NzaWJsZSBpbXBhY3Qgb2YgQ09WSUQtMTk6KioNCg0KLSAgIFRoZSBkb3dud2FyZCB0cmVuZCBpbiBlZHVjYXRpb24gc3BlbmRpbmcgYmVnYW4gaW4gMjAxNiBhbmQgYmVjYW1lIG1vcmUgcHJvbm91bmNlZCBhZnRlciAyMDE5LiBUaGlzIGNvaW5jaWRlcyB3aXRoIHRoZSBDT1ZJRC0xOSBwYW5kZW1pYywgc3VnZ2VzdGluZyB0aGF0IGl0IG1heSBoYXZlIHBsYXllZCBhIHNpZ25pZmljYW50IHJvbGUgaW4gdGhlIGRlY2xpbmUuDQotICAgR292ZXJubWVudHMgbWF5IGhhdmUgYmVlbiBmb3JjZWQgdG8gY3V0IGVkdWNhdGlvbiBzcGVuZGluZyB0byBkZWFsIHdpdGggdGhlIGVjb25vbWljIGFuZCBoZWFsdGggY2hhbGxlbmdlcyBvZiB0aGUgcGFuZGVtaWMuDQoNCioqSW1wb3J0YW50IGZpZ3VyZXM6KioNCg0KLSAgIFRoZSBtZWRpYW4gZ292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24gYXMgYSBwZXJjZW50YWdlIG9mIEdEUCBpbiAyMDIyIHdhcyAzLjYlLg0KLSAgIFRoZSBFZHVjYXRpb24gMjAzMCBGRkEgdGFyZ2V0IGlzIDQlLg0KLSAgIFRoZSBsYXJnZXN0IGRlY2xpbmUgaW4gZ292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24gYXMgYSBwZXJjZW50YWdlIG9mIEdEUCB3YXMgaW4gaGlnaC1pbmNvbWUgY291bnRyaWVzICgxLjEgcGVyY2VudGFnZSBwb2ludHMpLg0KDQoqKkNhbGwgdG8gYWN0aW9uOioqDQoNClRoaXMgZG93bndhcmQgdHJlbmQgaW4gZWR1Y2F0aW9uIHNwZW5kaW5nIGlzIGFsYXJtaW5nIGFuZCBuZWVkcyB0byBiZSByZXZlcnNlZC4gR292ZXJubWVudHMgc2hvdWxkIHByaW9yaXRpemUgZWR1Y2F0aW9uIHNwZW5kaW5nIGFuZCBlbnN1cmUgdGhhdCBpdCBtZWV0cyB0aGUgRWR1Y2F0aW9uIDIwMzAgRkZBIHRhcmdldCBwcm92aWRlZCB3ZSBhcmUgYWxtb3N0IGluIGhhbGYgd2F5LiBUaGlzIHdpbGwgcmVxdWlyZSBpbnZlc3RpbmcgbW9yZSByZXNvdXJjZXMgaW4gZWR1Y2F0aW9uLCBldmVuIGluIHRoZSBmYWNlIG9mIG90aGVyIGNoYWxsZW5nZXMuIEludmVzdGluZyBpbiBlZHVjYXRpb24gaXMgbm90IGp1c3QgYW4gZXhwZW5zZTsgaXQgaXMgYW4gaW52ZXN0bWVudCBpbiB0aGUgZnV0dXJlLg0KDQojIyBBbmFseXNpcyBvZiB0aGUgb3V0LW9mLXNjaG9vbCByYXRlIGZvciBjaGlsZHJlbiBvZiBwcmltYXJ5IHNjaG9vbCBhZ2UsIGJvdGggc2V4ZXMgKCUpDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PVRSVUUsIGVjaG89RkFMU0V9DQpvc3JfZGYgPC0gZGYgfD4NCiAgZmlsdGVyKA0KICAgIFllYXIgJWluJSBzZXEoMjAxNSwgMjAyMSksDQogICAgYEluZGljYXRvciBOYW1lYCA9PSAiT3V0LW9mLXNjaG9vbCByYXRlIGZvciBjaGlsZHJlbiBvZiBwcmltYXJ5IHNjaG9vbCBhZ2UsIGJvdGggc2V4ZXMgKCUpIg0KICApDQpvcGVueGxzeDo6d3JpdGUueGxzeChvc3JfZGYsICJkYXRhL3RpZHkvb3NyX2RmLnhsc3giKQ0KIyBnbGltcHNlKG9zcl9kZikNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFLCBlY2hvPUZBTFNFfQ0KcmVnb3NyX2RmIDwtIG9zcl9kZiB8Pg0KICBncm91cF9ieShyZWdpb24sIFllYXIpIHw+DQogIHN1bW1hcml6ZShtZWRpYW5fdmFsdWUgPSBtZWRpYW4oVmFsdWUpKSB8Pg0KICBtdXRhdGUodGFyZ2V0ID0gMCkNCiAgIyBzZWxlY3QoWWVhciwgUmVnaW9uLCBWYWx1ZSkNCiN2aWV3KHJlZ19kZikNCm9wZW54bHN4Ojp3cml0ZS54bHN4KHJlZ29zcl9kZiwgImRhdGEvdGlkeS9yZWdvc3JfZGYueGxzeCIpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQpyZWdtZWRpYW4gPC0gcmVnb3NyX2RmIHw+DQogIGdyb3VwX2J5KFllYXIpIHw+DQogIHN1bW1hcml6ZShjcm9zc3JlZ21lZCA9IG1lZGlhbihtZWRpYW5fdmFsdWUpKQ0KIyBlY296bWVkaWFuDQpgYGANCg0KIyMjIyMgKipGaWd1cmUgNToqKiBNZWRpYW4gdmFsdWUgb2YgdGhlIG91dC1vZi1zY2hvb2wgcmF0ZSBmb3IgY2hpbGRyZW4gb2YgcHJpbWFyeSBzY2hvb2wgYWdlIGZvciBkaWZmZXJlbnQgcmVnaW9uIGZyb20gMjAxNSB0byAyMDIyLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGggPSA5LjUsIGZpZy5oZWlnaHQgPSA2LCBvdXQud2lkdGg9ICIxMDAlIn0NCmdncGxvdGx5KA0KICBnZ3Bsb3QoDQogICAgcmVnb3NyX2RmLA0KICAgIGFlcygNCiAgICAgIHggPSBZZWFyLA0KICAgICAgeSA9IG1lZGlhbl92YWx1ZSwNCiAgICAgIGNvbG9yID0gcmVnaW9uDQogICAgKQ0KICApICsNCiAgICBnZW9tX2xpbmUoc2l6ZSA9IC44KSArDQogICAgZ2VvbV9saW5lKA0KICAgICAgZGF0YSA9IHJlZ21lZGlhbiwNCiAgICAgIGFlcyh4ID0gWWVhciwgeSA9IGNyb3NzcmVnbWVkKSwNCiAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsDQogICAgICBjb2xvciA9ICJibGFjayIsDQogICAgICBzaXplID0gMQ0KICAgICkgKw0KICAgICBnZW9tX3RleHQoDQogICAgICBhZXMoeCA9IDIwMTgsIHkgPSAxNiwgbGFiZWwgPSAi4pagIOKWoCDilqAgQ3Jvc3MtcmVnaW9uYWwgbWVkaWFuIHZhbHVlIiksIA0KICAgICAgaGp1c3QgPSAwLjUsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiYmxhY2siDQogICAgKSArDQogICAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheSIpKSArDQogICAgZ2VvbV9zZWdtZW50KA0KICAgICAgYWVzKHggPSAyMDIxLCB4ZW5kID0gMjAyMSwgeSA9IDAsIHllbmQgPSAxOCksDQogICAgICBjb2xvciA9ICJyZWQiLA0KICAgICAgc2l6ZSA9IDEsDQogICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiDQogICAgKSAgKw0KICAgIHNjYWxlX2NvbG9yX21hbnVhbCgNCiAgICAgIHZhbHVlcyA9IGMoDQogICAgICAgICJkb2RnZXJibHVlIiwgIm9yYW5nZTMiLCAicHVycGxlMyIsICJicm93bjQiLCAiZGFya2JsdWUiLCAiZGFya2dyZWVuIiwgICJwaW5rMyINCiAgICAgICkNCiAgICApICArDQogICAgZ2VvbV90ZXh0KA0KICAgICAgYWVzKHggPSAyMDE5LCB5ID0gOCwNCiAgICAgICAgICBsYWJlbCA9ICJUaGUgZ2FwIGJldHdlZW4gdGhlIHRhcmdldFxuIGFuZCBTdWItU2FoYXJhbiBBZnJpY2Enc1xuIHZhbHVlIGluIDIwMjEgaXMgMTguNCINCiAgICAgICAgKSwgDQogICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJyZWQiDQogICAgKSArDQogICAgZ2VvbV9saW5lKA0KICAgICAgYWVzKHggPSBZZWFyLCB5ID0gdGFyZ2V0KSwNCiAgICAgIGNvbG9yID0gImRhcmtncmVlbiIsDQogICAgICBzaXplID0gMSwNCiAgICAgIGxpbmV0eXBlID0gImRvdHRlZCINCiAgICApICsNCiAgICBnZW9tX3RleHQoDQogICAgICBhZXMoeCA9IDIwMTksIHkgPSAtMiwgbGFiZWwgPSAi4pagIOKWoCDilqAgRWR1Y2F0aW9uIDIwMzAgRkZBIFRhcmdldCIpLCANCiAgICAgIGhqdXN0ID0gMC41LCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtncmVlbiINCiAgICApICsNCiAgICBsYWJzKA0KICAgICAgI3RpdGxlID0gIlNtb290aCBMaW5lIFBsb3Qgd2l0aCBMZWdlbmQgYW5kIE1hcmtlcnMiLA0KICAgICAgeCA9ICJZZWFyIiwNCiAgICAgIHkgPSAiTWVkaWFuIFZhbHVlIiwNCiAgICAgIGNhcHRpb24gPSAiU291cmNlOiBodHRwOi8vc2RnNC1kYXRhLnVpcy51bmVzY28ub3JnLyINCiAgICApIA0KKQ0KYGBgDQojIyMjIyAqKlNvdXJjZSA6IDxodHRwOi8vc2RnNC1kYXRhLnVpcy51bmVzY28ub3JnLz4qKg0KDQoqKlRoZSBsaW5lIGdyYXBoIGFib3ZlIHNob3dzIHRoZSBtZWRpYW4gdmFsdWUgdHJlbmRzIG9mIHRoZSBPdXQtb2Ytc2Nob29sIHJhdGUgZm9yIGNoaWxkcmVuIG9mIHByaW1hcnkgc2Nob29sIGFnZSwgYm90aCBzZXhlcyBmb3IgZGlmZmVyZW50IHJlZ2lvbiBmcm9tIDIwMTUgdG8gMjAyMi4qKg0KDQpIZXJlIGFyZSBzb21lIG9mIHRoZSBrZXkgaW5zaWdodHMgd2UgY2FuIGdsZWFuIGZyb20gdGhpcyBkYXRhOg0KDQoqICoqT3ZlcmFsbCBpbmNyZWFzZSBpbiBvdXQtb2Ytc2Nob29sIGNoaWxkcmVuOioqIFRoZSBjcm9zcy1yZWdpb25hbCBtZWRpYW4gdmFsdWUgaW5jcmVhc2VkIGZyb20gMi42JSBpbiAyMDE1IHRvIDQuNCUgaW4gMjAyMiwgZXhjZWVkaW5nIHRoZSBFZHVjYXRpb24gMjAzMCBGRkEgdGFyZ2V0IG9mIDAlLiBUaGlzIG1lYW5zIHRoYXQgb24gYXZlcmFnZSwgbW9yZSBjaGlsZHJlbiBhcmUgb3V0IG9mIHNjaG9vbCBub3cgdGhhbiBpbiAyMDE1Lg0KKiAqKkRpc3Bhcml0aWVzIGJldHdlZW4gcmVnaW9uczoqKiBUaGUgaW5jcmVhc2UgaGFzIGJlZW4gbW9zdCBwcm9ub3VuY2VkIGluIFN1Yi1TYWhhcmFuIEFmcmljYSwgd2hlcmUgdGhlIG1lZGlhbiB2YWx1ZSBpbmNyZWFzZWQgYnkgMy4xIHBlcmNlbnRhZ2UgcG9pbnRzIGJldHdlZW4gMjAxNSBhbmQgMjAyMi4gVGhlIGdhcCBiZXR3ZWVuIHRoZSB0YXJnZXQgYW5kIFN1Yi1TYWhhcmFuIEFmcmljYSdzIHZhbHVlIGluIDIwMjEgaXMgYSBzaWduaWZpY2FudCAxOC40IHBlcmNlbnRhZ2UgcG9pbnRzLg0KKiBUaGUgU3ViLVNhaGFyYW4gQWZyaWNhbiwgU291dGggQXNpYSBhbmQgTGF0aW4gQW1lcmljYSAmIENhcmliYmVhbiByZWdpb25zIGhhdmUgY29uc2lzdGVudGx5IGV2b2xkZWQgb3ZlcmhlYWQgdGhlIGNyb3NzLXJlZ2lvbmFsIG1lZGlhbiB2YWx1ZS4gVGhpcyBzdWdnZXN0cyB0aGF0IHRoZXNlIHJlZ2lvbnMgYXJlIG5vdCBtYWtpbmcgcHJvZ3Jlc3MgdG93YXJkcyBhY2hpZXZpbmcgdW5pdmVyc2FsIHByaW1hcnkgZWR1Y2F0aW9uLg0KKiAqKlBvdGVudGlhbCBjYXVzZXM6KiogVGhlIENPVklELTE5IHBhbmRlbWljIG1heSBoYXZlIHBsYXllZCBhIHJvbGUgaW4gdGhpcyBpbmNyZWFzZSwgYXMgbWFueSBzY2hvb2xzIHdlcmUgY2xvc2VkIGR1cmluZyB0aGUgcGFuZGVtaWMuIEhvd2V2ZXIsIG90aGVyIGZhY3RvcnMsIHN1Y2ggYXMgcG92ZXJ0eSBvciBjb25mbGljdCwgbWF5IGFsc28gaGF2ZSBjb250cmlidXRlZC4NCiogKipJbXBvcnRhbmNlIG9mIGVkdWNhdGlvbjoqKiBFZHVjYXRpb24gaXMgZXNzZW50aWFsIGZvciBlY29ub21pYyBkZXZlbG9wbWVudCBhbmQgcG92ZXJ0eSByZWR1Y3Rpb24uIFRoZSBpbmNyZWFzaW5nIG91dC1vZi1zY2hvb2wgcmF0ZSBpcyBhIHdvcnJ5aW5nIHRyZW5kIHRoYXQgY291bGQgaGF2ZSBuZWdhdGl2ZSBjb25zZXF1ZW5jZXMgZm9yIHRoZXNlIHJlZ2lvbnMgaW4gdGhlIGxvbmcgdGVybS4NCg0KSGVyZSBhcmUgc29tZSBhZGRpdGlvbmFsIHRob3VnaHRzIG9uIHRoZSBkYXRhOg0KDQoqIFRoZSBncmFwaCBvbmx5IHNob3dzIHRoZSBtZWRpYW4gdmFsdWVzIGZvciBlYWNoIHJlZ2lvbi4gSXQgd291bGQgYmUgaW50ZXJlc3RpbmcgdG8gc2VlIHRoZSBmdWxsIHJhbmdlIG9mIGRhdGEgZm9yIGVhY2ggcmVnaW9uIHRvIGdldCBhIGJldHRlciBzZW5zZSBvZiB0aGUgdmFyaWFiaWxpdHkgd2l0aGluIGVhY2ggcmVnaW9uLg0KKiBUaGUgZ3JhcGggZG9lcyBub3QgcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gb24gdGhlIHJlYXNvbnMgd2h5IGNoaWxkcmVuIGFyZSBvdXQgb2Ygc2Nob29sLiBJdCB3b3VsZCBiZSBoZWxwZnVsIHRvIGhhdmUgbW9yZSBkYXRhIG9uIHRoaXMgdG8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIHByb2JsZW0gYW5kIGRldmVsb3AgZWZmZWN0aXZlIGludGVydmVudGlvbnMuDQoqIERlc3BpdGUgdGhlIG92ZXJhbGwgaW5jcmVhc2UsIHRoZXJlIG1heSBiZSBzb21lIHJlZ2lvbnMgb3IgY291bnRyaWVzIHRoYXQgYXJlIG1ha2luZyBwcm9ncmVzcyBpbiByZWR1Y2luZyB0aGVpciBvdXQtb2Ytc2Nob29sIHJhdGVzLiBJdCBpcyBpbXBvcnRhbnQgdG8gaWRlbnRpZnkgYW5kIHNoYXJlIGJlc3QgcHJhY3RpY2VzIGZyb20gdGhlc2Ugc3VjY2VzcyBzdG9yaWVzLg0KDQpPdmVyYWxsLCB0aGUgbGluZSBncmFwaCBoaWdobGlnaHRzIGEgc2VyaW91cyBwcm9ibGVtIHRoYXQgbmVlZHMgdG8gYmUgYWRkcmVzc2VkLiBNb3JlIHJlc2VhcmNoIGlzIG5lZWRlZCB0byB1bmRlcnN0YW5kIHRoZSBjYXVzZXMgb2YgdGhlIGluY3JlYXNlIGluIG91dC1vZi1zY2hvb2wgY2hpbGRyZW4sIGFuZCBlZmZlY3RpdmUgaW50ZXJ2ZW50aW9ucyBhcmUgbmVlZGVkIHRvIGdldCBtb3JlIGNoaWxkcmVuIGJhY2sgaW50byBzY2hvb2wuDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9VFJVRSwgZWNobz1GQUxTRX0NCmVjb3pvc3JfZGYgPC0gb3NyX2RmIHw+DQogIGdyb3VwX2J5KGBJbmNvbWUgZ3JvdXBgLCBZZWFyKSB8Pg0KICBzdW1tYXJpemUobWVkaWFuX3ZhbHVlID0gbWVkaWFuKFZhbHVlKSkgfD4NCiAgbXV0YXRlKHRhcmdldCA9IDApDQogICMgc2VsZWN0KFllYXIsIFJlZ2lvbiwgVmFsdWUpDQojdmlldyhlY296X2RmKQ0Kb3Blbnhsc3g6OndyaXRlLnhsc3goZWNvem9zcl9kZiwgImRhdGEvdGlkeS9lY296b3NyX2RmLnhsc3giKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KZWNvem1lZGlhbiA8LSBlY296b3NyX2RmIHw+DQogIGdyb3VwX2J5KFllYXIpIHw+DQogIHN1bW1hcml6ZShjcm9zc2Vjb3ptZWQgPSBtZWRpYW4obWVkaWFuX3ZhbHVlKSkNCiMgZWNvem1lZGlhbg0KYGBgDQoNCiMjIyMjICoqRmlndXJlIDY6KiogTWVkaWFuIHZhbHVlIG9mIHRoZSBvdXQtb2Ytc2Nob29sIHJhdGUgZm9yIGNoaWxkcmVuIG9mIHByaW1hcnkgc2Nob29sIGFnZSBmb3IgZGlmZmVyZW50IEluY29tZSBncm91cHMgZnJvbSAyMDE1IHRvIDIwMjIuDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aCA9IDkuNSwgZmlnLmhlaWdodCA9IDYsIG91dC53aWR0aD0gIjEwMCUifQ0KZ2dwbG90bHkoDQogIGdncGxvdCgNCiAgICBlY296b3NyX2RmLA0KICAgIGFlcygNCiAgICAgIHggPSBZZWFyLA0KICAgICAgeSA9IG1lZGlhbl92YWx1ZSwNCiAgICAgIGNvbG9yID0gYEluY29tZSBncm91cGANCiAgICApDQogICkgKw0KICAgIGdlb21fbGluZShzaXplID0gLjgpICsNCiAgICBnZW9tX2xpbmUoDQogICAgICBkYXRhID0gZWNvem1lZGlhbiwNCiAgICAgIGFlcyh4ID0gWWVhciwgeSA9IGNyb3NzZWNvem1lZCksDQogICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiLA0KICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgc2l6ZSA9IDENCiAgICApICsNCiAgICAgZ2VvbV90ZXh0KA0KICAgICAgYWVzKHggPSAyMDE4LCB5ID0gMTAsIGxhYmVsID0gIuKWoCDilqAg4pagIENyb3NzLWluY29tZSBncm91cCBtZWRpYW4gdmFsdWUiKSwgDQogICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJibGFjayINCiAgICApICsNCiAgICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJncmF5IikpICsNCiAgICBnZW9tX3NlZ21lbnQoDQogICAgICBhZXMoeCA9IDIwMjEsIHhlbmQgPSAyMDIxLCB5ID0gMCwgeWVuZCA9IDI1KSwNCiAgICAgIGNvbG9yID0gInJlZCIsDQogICAgICBzaXplID0gMSwNCiAgICAgIGxpbmV0eXBlID0gImRvdHRlZCINCiAgICApICArDQogICAgc2NhbGVfY29sb3JfbWFudWFsKA0KICAgICAgdmFsdWVzID0gYygNCiAgICAgICAgInBpbmszIiwicHVycGxlMyIgLCAiZGFya2JsdWUiLCAib3JhbmdlMyINCiAgICAgICkNCiAgICApICsNCiAgICBnZW9tX3RleHQoDQogICAgICBhZXMoeCA9IDIwMTksIHkgPSAxNywNCiAgICAgICAgICBsYWJlbCA9ICJUaGUgZ2FwIGJldHdlZW4gdGhlIHRhcmdldFxuIGFuZCBsb3cgaW5jb21lIGNvdW50cmllcydcbiB2YWx1ZSBpbiAyMDIxIGlzIDI0LjgiDQogICAgICAgICksIA0KICAgICAgaGp1c3QgPSAwLjUsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAicmVkIg0KICAgICkgKw0KICAgIGdlb21fbGluZSgNCiAgICAgIGFlcyh4ID0gWWVhciwgeSA9IHRhcmdldCksDQogICAgICBjb2xvciA9ICJkYXJrZ3JlZW4iLA0KICAgICAgc2l6ZSA9IDEsDQogICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiDQogICAgKSArDQogICAgZ2VvbV90ZXh0KA0KICAgICAgYWVzKHggPSAyMDE5LCB5ID0gLTIsIGxhYmVsID0gIuKWoCDilqAg4pagIEVkdWNhdGlvbiAyMDMwIEZGQSBUYXJnZXQiKSwgDQogICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrZ3JlZW4iDQogICAgKSArDQogICAgbGFicygNCiAgICAgICN0aXRsZSA9ICJTbW9vdGggTGluZSBQbG90IHdpdGggTGVnZW5kIGFuZCBNYXJrZXJzIiwNCiAgICAgIHggPSAiWWVhciIsDQogICAgICB5ID0gIk1lZGlhbiBWYWx1ZSINCiAgICApDQopDQpgYGANCiMjIyMjICoqU291cmNlIDogPGh0dHA6Ly9zZGc0LWRhdGEudWlzLnVuZXNjby5vcmcvPioqDQoNCioqVGhlIGxpbmUgZ3JhcGggYWJvdmUgc2hvd3MgdGhlIG1lZGlhbiB2YWx1ZSB0cmVuZHMgb2YgdGhlIG91dC1vZi1zY2hvb2wgcmF0ZSBmb3IgY2hpbGRyZW4gb2YgcHJpbWFyeSBzY2hvb2wgYWdlIGZvciBkaWZmZXJlbnQgSW5jb21lIGdyb3VwcyBmcm9tIDIwMTUgdG8gMjAyMi4qKg0KDQpIZXJlIGFyZSBzb21lIG9mIHRoZSBrZXkgaW5zaWdodHMgd2UgY2FuIGdsZWFuIGZyb20gdGhpcyBkYXRhOg0KDQoqICoqT3ZlcmFsbCBpbmNyZWFzZSBpbiBvdXQtb2Ytc2Nob29sIGNoaWxkcmVuOioqIFRoZSBtZWRpYW4gdmFsdWUgaW5jcmVhc2VkIGZyb20gNC44JSBpbiAyMDE1IHRvIDUuNSUgaW4gMjAyMiwgZXhjZWVkaW5nIHRoZSBFZHVjYXRpb24gMjAzMCBGRkEgdGFyZ2V0IG9mIDAlLiBUaGlzIG1lYW5zIHRoYXQgb24gYXZlcmFnZSwgbW9yZSBjaGlsZHJlbiBhcmUgb3V0IG9mIHNjaG9vbCBub3cgdGhhbiBpbiAyMDE1Lg0KKiAqKkRpc3Bhcml0aWVzIGJldHdlZW4gaW5jb21lIGdyb3VwczoqKiBUaGUgaW5jcmVhc2UgaGFzIGJlZW4gbW9zdCBwcm9ub3VuY2VkIGluIGxvdy1pbmNvbWUgY291bnRyaWVzLCB3aGVyZSB0aGUgbWVkaWFuIHZhbHVlIGluY3JlYXNlZCBieSAzLjEgcGVyY2VudGFnZSBwb2ludHMgYmV0d2VlbiAyMDE1IGFuZCAyMDIyLiBUaGUgZ2FwIGJldHdlZW4gdGhlIHRhcmdldCBhbmQgbG93IGluY29tZSBjb3VudHJpZXMnIHZhbHVlIGluIDIwMjEgaXMgYSBzaWduaWZpY2FudCAyNC44IHBlcmNlbnRhZ2UgcG9pbnRzLg0KKiAqKlBvdGVudGlhbCBjYXVzZXM6KiogVGhlIENPVklELTE5IHBhbmRlbWljIG1heSBoYXZlIHBsYXllZCBhIHJvbGUgaW4gdGhpcyBpbmNyZWFzZSwgYXMgbWFueSBzY2hvb2xzIHdlcmUgY2xvc2VkIGR1cmluZyB0aGUgcGFuZGVtaWMuIEhvd2V2ZXIsIG90aGVyIGZhY3RvcnMsIHN1Y2ggYXMgcG92ZXJ0eSBvciBjb25mbGljdCwgbWF5IGFsc28gaGF2ZSBjb250cmlidXRlZC4NCiogKipJbXBvcnRhbmNlIG9mIGVkdWNhdGlvbjoqKiBFZHVjYXRpb24gaXMgZXNzZW50aWFsIGZvciBlY29ub21pYyBkZXZlbG9wbWVudCBhbmQgcG92ZXJ0eSByZWR1Y3Rpb24uIFRoZSBpbmNyZWFzaW5nIG91dC1vZi1zY2hvb2wgcmF0ZSBpcyBhIHdvcnJ5aW5nIHRyZW5kIHRoYXQgY291bGQgaGF2ZSBuZWdhdGl2ZSBjb25zZXF1ZW5jZXMgZm9yIHRoZXNlIHJlZ2lvbnMgaW4gdGhlIGxvbmcgdGVybS4NCg0KSGVyZSBhcmUgc29tZSBhZGRpdGlvbmFsIHRob3VnaHRzIG9uIHRoZSBkYXRhOg0KDQoqIFRoZSBncmFwaCBvbmx5IHNob3dzIHRoZSBtZWRpYW4gdmFsdWVzIGZvciBlYWNoIHJlZ2lvbi4gSXQgd291bGQgYmUgaW50ZXJlc3RpbmcgdG8gc2VlIHRoZSBmdWxsIHJhbmdlIG9mIGRhdGEgZm9yIGVhY2ggcmVnaW9uIHRvIGdldCBhIGJldHRlciBzZW5zZSBvZiB0aGUgdmFyaWFiaWxpdHkgd2l0aGluIGVhY2ggcmVnaW9uLg0KKiBUaGUgZ3JhcGggZG9lcyBub3QgcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gb24gdGhlIHJlYXNvbnMgd2h5IGNoaWxkcmVuIGFyZSBvdXQgb2Ygc2Nob29sLiBJdCB3b3VsZCBiZSBoZWxwZnVsIHRvIGhhdmUgbW9yZSBkYXRhIG9uIHRoaXMgdG8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIHByb2JsZW0gYW5kIGRldmVsb3AgZWZmZWN0aXZlIGludGVydmVudGlvbnMuDQoqIERlc3BpdGUgdGhlIG92ZXJhbGwgaW5jcmVhc2UsIHRoZXJlIG1heSBiZSBzb21lIHJlZ2lvbnMgb3IgY291bnRyaWVzIHRoYXQgYXJlIG1ha2luZyBwcm9ncmVzcyBpbiByZWR1Y2luZyB0aGVpciBvdXQtb2Ytc2Nob29sIHJhdGVzLiBJdCBpcyBpbXBvcnRhbnQgdG8gaWRlbnRpZnkgYW5kIHNoYXJlIGJlc3QgcHJhY3RpY2VzIGZyb20gdGhlc2Ugc3VjY2VzcyBzdG9yaWVzLg0KDQpPdmVyYWxsLCB0aGUgbGluZSBncmFwaCBoaWdobGlnaHRzIGEgc2VyaW91cyBwcm9ibGVtIHRoYXQgbmVlZHMgdG8gYmUgYWRkcmVzc2VkLiBNb3JlIHJlc2VhcmNoIGlzIG5lZWRlZCB0byB1bmRlcnN0YW5kIHRoZSBjYXVzZXMgb2YgdGhlIGluY3JlYXNlIGluIG91dC1vZi1zY2hvb2wgY2hpbGRyZW4sIGFuZCBlZmZlY3RpdmUgaW50ZXJ2ZW50aW9ucyBhcmUgbmVlZGVkIHRvIGdldCBtb3JlIGNoaWxkcmVuIGJhY2sgaW50byBzY2hvb2wuDQoNCg0KIyMgQW5hbHlzaXMgb2YgdGhlIENvbXBsZXRpb24gcmF0ZSwgcHJpbWFyeSBlZHVjYXRpb24sIGJvdGggc2V4ZXMgKCUpDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aCA9IDkuNSwgZmlnLmhlaWdodCA9IDYsIG91dC53aWR0aD0gIjEwMCUifQ0KY3JwZWR1Y19kZiA8LSBkZiB8Pg0KICBmaWx0ZXIoDQogICAgWWVhciAlaW4lIHNlcSgyMDE1LCAyMDIxKSwNCiAgICBgSW5kaWNhdG9yIE5hbWVgID09ICJDb21wbGV0aW9uIHJhdGUsIHByaW1hcnkgZWR1Y2F0aW9uLCBib3RoIHNleGVzICglKSINCiAgKSANCm9wZW54bHN4Ojp3cml0ZS54bHN4KGNycGVkdWNfZGYsICJkYXRhL3RpZHkvY3JwZWR1Y19kZi54bHN4IikNCiMgZ2xpbXBzZShvc3JfZGYpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9VFJVRSwgZWNobz1GQUxTRX0NCnJlZ2NycGVkdWNfZGYgPC0gY3JwZWR1Y19kZiB8Pg0KICBncm91cF9ieShyZWdpb24sIFllYXIpIHw+DQogIHN1bW1hcml6ZShtZWRpYW5fdmFsdWUgPSBtZWRpYW4oVmFsdWUpKSB8Pg0KICBtdXRhdGUodGFyZ2V0ID0gMTAwKSAjfD4NCiAgIyBzZWxlY3QoWWVhciwgUmVnaW9uLCBWYWx1ZSkNCiN2aWV3KHJlZ19kZikNCm9wZW54bHN4Ojp3cml0ZS54bHN4KHJlZ2NycGVkdWNfZGYsICJkYXRhL3RpZHkvcmVnY3JwZWR1Y19kZi54bHN4IikNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnJlZ21lZGlhbiA8LSByZWdjcnBlZHVjX2RmIHw+DQogIGdyb3VwX2J5KFllYXIpIHw+DQogIHN1bW1hcml6ZShjcm9zc3JlZ21lZCA9IG1lZGlhbihtZWRpYW5fdmFsdWUpKQ0KIyBlY296bWVkaWFuDQpgYGANCg0KIyMjIyMgKipGaWd1cmUgNzoqKiBNZWRpYW4gdmFsdWUgdHJlbmQgb2YgdGhlIG9tcGxldGlvbiByYXRlLCBwcmltYXJ5IGVkdWNhdGlvbiwgZm9yIGRpZmZlcmVudCByZWdpb24gZnJvbSAyMDE1IHRvIDIwMjIuDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aCA9IDkuNSwgZmlnLmhlaWdodCA9IDYsIG91dC53aWR0aD0gIjEwMCUifQ0KZ2dwbG90bHkoDQogIHJlZ2NycGVkdWNfZGYgfD4NCiAgICAjIGZpbHRlcigNCiAgICAjICAgcmVnaW9uICVpbiUgYygNCiAgICAjICAgICAiRXVyb3BlICYgQ2VudHJhbCBBc2lhIiwgIkxhdGluIEFtZXJpY2EgJiBDYXJpYmJlYW4iLCAiU3ViLVNhaGFyYW4gQWZyaWNhIg0KICAgICMgICApDQogICAgIyApIHw+DQogICAgZmlsdGVyKCEocmVnaW9uID09ICJTb3V0aCBBc2lhIikpIHw+DQogIGdncGxvdCgNCiAgICBhZXMoDQogICAgICB4ID0gWWVhciwNCiAgICAgIHkgPSBtZWRpYW5fdmFsdWUsDQogICAgICBjb2xvciA9IHJlZ2lvbg0KICAgICkNCiAgKSArDQogICAgZ2VvbV9saW5lKHNpemUgPSAuOCkgKw0KICAgIGdlb21fbGluZSgNCiAgICAgIGRhdGEgPSByZWdtZWRpYW4sDQogICAgICBhZXMoeCA9IFllYXIsIHkgPSBjcm9zc3JlZ21lZCksDQogICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiLA0KICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgc2l6ZSA9IDEuMg0KICAgICkgKw0KICAgICBnZW9tX3RleHQoDQogICAgICBhZXMoeCA9IDIwMTgsIHkgPSAwLCBsYWJlbCA9ICLilqAg4pagIOKWoCBDcm9zcy1yZWdpb25hbCBtZWRpYW4gdmFsdWUiKSwgDQogICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJibGFjayINCiAgICApICsNCiAgICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJncmF5IikpICsNCiAgICBnZW9tX3NlZ21lbnQoDQogICAgICBhZXMoeCA9IDIwMjEsIHhlbmQgPSAyMDIxLCB5ID0gNzMuMTQsIHllbmQgPSAxMDApLA0KICAgICAgY29sb3IgPSAicmVkIiwNCiAgICAgIHNpemUgPSAxLA0KICAgICAgbGluZXR5cGUgPSAiZG90dGVkIg0KICAgICkgICsNCiAgICBnZW9tX3RleHQoDQogICAgICBhZXMoeCA9IDIwMTgsIHkgPSA3MiwgDQogICAgICAgICAgbGFiZWwgPSAiVGhlIGdhcCBiZXR3ZWVuIHRoZSB0YXJnZXRcbiBhbmQgU3ViLVNhaGFyYW4gQWZyaWNhJ3NcbiB2YWx1ZSBpbiAyMDIxIGlzIDI2LjkiDQogICAgICAgICksDQogICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJyZWQiDQogICAgKSArDQogICAgZ2VvbV9saW5lKA0KICAgICAgYWVzKHggPSBZZWFyLCB5ID0gdGFyZ2V0KSwNCiAgICAgIGNvbG9yID0gImRhcmtncmVlbiIsDQogICAgICBzaXplID0gMS4yLA0KICAgICAgbGluZXR5cGUgPSAiZG90dGVkIg0KICAgICkgKw0KICAgIGdlb21fdGV4dCgNCiAgICAgIGFlcyh4ID0gMjAxOCwgeSA9IDE1LCBsYWJlbCA9ICLilqAg4pagIOKWoCBFZHVjYXRpb24gMjAzMCBGRkEgVGFyZ2V0IiksIA0KICAgICAgaGp1c3QgPSAwLjUsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2dyZWVuIg0KICAgICkgKw0KICAgIHNjYWxlX2NvbG9yX21hbnVhbCgNCiAgICAgIHZhbHVlcyA9IGMoDQogICAgICAgICJkYXJrYmx1ZSIsICJvcmFuZ2UzIiwgInB1cnBsZTMiLCAiYnJvd240IiwgImRhcmtncmVlbiIsICJwaW5rMyIsICJkb2RnZXJibHVlIiANCiAgICAgICkNCiAgICApICArDQogICAgbGFicygNCiAgICAgICN0aXRsZSA9ICJTbW9vdGggTGluZSBQbG90IHdpdGggTGVnZW5kIGFuZCBNYXJrZXJzIiwNCiAgICAgIHggPSAiWWVhciIsDQogICAgICB5ID0gIk1lZGlhbiBWYWx1ZSIsDQogICAgICBjYXB0aW9uID0gIlNvdXJjZTogaHR0cDovL3NkZzQtZGF0YS51aXMudW5lc2NvLm9yZy8iDQogICAgKSANCikNCmBgYA0KIyMjIyMgKipTb3VyY2UgOiA8aHR0cDovL3NkZzQtZGF0YS51aXMudW5lc2NvLm9yZy8+KioNCg0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PVRSVUUsIGVjaG89RkFMU0V9DQplY296Y3JwZWR1Y19kZiA8LSBjcnBlZHVjX2RmIHw+DQogIGdyb3VwX2J5KGBJbmNvbWUgZ3JvdXBgLCBZZWFyKSB8Pg0KICBzdW1tYXJpemUobWVkaWFuX3ZhbHVlID0gbWVkaWFuKFZhbHVlKSkgfD4NCiAgbXV0YXRlKHRhcmdldCA9IDEwMCkNCiAgIyBzZWxlY3QoWWVhciwgUmVnaW9uLCBWYWx1ZSkNCiN2aWV3KGVjb3pfZGYpDQpvcGVueGxzeDo6d3JpdGUueGxzeChlY296Y3JwZWR1Y19kZiwgImRhdGEvdGlkeS9lY296Y3JwZWR1Y19kZi54bHN4IikNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KZWNvem1lZGlhbiA8LSBlY296Y3JwZWR1Y19kZiB8Pg0KICBncm91cF9ieShZZWFyKSB8Pg0KICBzdW1tYXJpemUoY3Jvc3NlY296bWVkID0gbWVkaWFuKG1lZGlhbl92YWx1ZSkpDQojIGVjb3ptZWRpYW4NCmBgYA0KDQojIyMjIyAqKkZpZ3VyZSA4OioqIE1lZGlhbiB2YWx1ZSB0cmVuZCBvZiB0aGUgb21wbGV0aW9uIHJhdGUsIHByaW1hcnkgZWR1Y2F0aW9uLCBmb3IgZGlmZmVyZW50IEluY29tZSBncm91cHMgZnJvbSAyMDE1IHRvIDIwMjIuDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aCA9IDkuNSwgZmlnLmhlaWdodCA9IDYsIG91dC53aWR0aD0gIjEwMCUifQ0KZ2dwbG90bHkoDQogIGdncGxvdCgNCiAgICBlY296Y3JwZWR1Y19kZiwNCiAgICBhZXMoDQogICAgICB4ID0gWWVhciwNCiAgICAgIHkgPSBtZWRpYW5fdmFsdWUsDQogICAgICBjb2xvciA9IGBJbmNvbWUgZ3JvdXBgDQogICAgKQ0KICApICsNCiAgICBnZW9tX2xpbmUoc2l6ZSA9IC44KSArDQogICAgZ2VvbV9saW5lKA0KICAgICAgZGF0YSA9IGVjb3ptZWRpYW4sDQogICAgICBhZXMoeCA9IFllYXIsIHkgPSBjcm9zc2Vjb3ptZWQpLA0KICAgICAgbGluZXR5cGUgPSAiZG90dGVkIiwNCiAgICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgIHNpemUgPSAxDQogICAgKSArDQogICAgIGdlb21fdGV4dCgNCiAgICAgIGFlcyh4ID0gMjAxOCwgeSA9IDAsIGxhYmVsID0gIuKWoCDilqAg4pagIENyb3NzLWluY29tZSBncm91cCBtZWRpYW4gdmFsdWUiKSwgDQogICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJibGFjayINCiAgICApICsNCiAgICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJncmF5IikpICsNCiAgICBnZW9tX3NlZ21lbnQoDQogICAgICBhZXMoeCA9IDIwMjEsIHhlbmQgPSAyMDIxLCB5ID0gNDkuNjgsIHllbmQgPSAxMDApLA0KICAgICAgY29sb3IgPSAicmVkIiwNCiAgICAgIHNpemUgPSAxLA0KICAgICAgbGluZXR5cGUgPSAiZG90dGVkIg0KICAgICkgICsNCiAgICBnZW9tX3RleHQoDQogICAgICBhZXMoeCA9IDIwMTgsIHkgPSA2NSwNCiAgICAgIGxhYmVsID0gIlRoZSBnYXAgYmV0d2VlbiB0aGUgdGFyZ2V0XG4gYW5kIGxvdyBpbmNvbWUgY291bnRyaWVzJ1xuIHZhbHVlIGluIDIwMjEgaXMgNTAuMyIpLA0KICAgICAgaGp1c3QgPSAwLjUsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAicmVkIg0KICAgICkgKw0KICAgIGdlb21fbGluZSgNCiAgICAgIGFlcyh4ID0gWWVhciwgeSA9IHRhcmdldCksDQogICAgICBjb2xvciA9ICJkYXJrZ3JlZW4iLA0KICAgICAgc2l6ZSA9IDEsDQogICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiDQogICAgKSArDQogICAgZ2VvbV90ZXh0KA0KICAgICAgYWVzKHggPSAyMDE4LCB5ID0gMTUsIGxhYmVsID0gIuKWoCDilqAg4pagIEVkdWNhdGlvbiAyMDMwIEZGQSBUYXJnZXQiKSwgDQogICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrZ3JlZW4iDQogICAgKSArDQogICAgc2NhbGVfY29sb3JfbWFudWFsKA0KICAgICAgdmFsdWVzID0gYygNCiAgICAgICAgImRhcmtncmVlbiIsInB1cnBsZTMiICwgImRhcmtibHVlIiwgIm9yYW5nZTMiDQogICAgICApDQogICAgKSArDQogICAgbGFicygNCiAgICAgICN0aXRsZSA9ICJTbW9vdGggTGluZSBQbG90IHdpdGggTGVnZW5kIGFuZCBNYXJrZXJzIiwNCiAgICAgIHggPSAiWWVhciIsDQogICAgICB5ID0gIk1lZGlhbiBWYWx1ZSINCiAgICApDQopDQpgYGANCg0KIyMjIyMgKipTb3VyY2UgOiA8aHR0cDovL3NkZzQtZGF0YS51aXMudW5lc2NvLm9yZy8+KioNCg0KIyMgQW5hbHlzaXMgb2YgdGhlIE5ldCBlbnJvbG1lbnQgcmF0ZSwgZWFybHkgY2hpbGRob29kIGVkdWNhdGlvbiwgYm90aCBzZXhlcyAoJSkNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9VFJVRSwgZWNobz1GQUxTRX0NCm5lcmVjZWR1Y19kZiA8LSBkZiB8Pg0KICBmaWx0ZXIoDQogICAgWWVhciAlaW4lIHNlcSgyMDE1LCAyMDIxKSwNCiAgICBgSW5kaWNhdG9yIE5hbWVgID09ICJOZXQgZW5yb2xtZW50IHJhdGUsIGVhcmx5IGNoaWxkaG9vZCBlZHVjYXRpb24sIGJvdGggc2V4ZXMgKCUpIg0KICApDQpvcGVueGxzeDo6d3JpdGUueGxzeChuZXJlY2VkdWNfZGYsICJkYXRhL3RpZHkvbmVyZWNlZHVjX2RmLnhsc3giKQ0KIyBnbGltcHNlKG9zcl9kZikNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFLCBlY2hvPUZBTFNFfQ0KcmVnbmVyZWNlZHVjX2RmIDwtIG5lcmVjZWR1Y19kZiB8Pg0KICBncm91cF9ieShyZWdpb24sIFllYXIpIHw+DQogIHN1bW1hcml6ZShtZWRpYW5fdmFsdWUgPSBtZWRpYW4oVmFsdWUpKSB8Pg0KICBtdXRhdGUodGFyZ2V0ID0gMTAwKQ0KICAjIHNlbGVjdChZZWFyLCBSZWdpb24sIFZhbHVlKQ0KI3ZpZXcocmVnX2RmKQ0Kb3Blbnhsc3g6OndyaXRlLnhsc3gocmVnbmVyZWNlZHVjX2RmLCAiZGF0YS90aWR5L3JlZ25lcmVjZWR1Y19kZi54bHN4IikNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KcmVnbWVkaWFuIDwtIHJlZ25lcmVjZWR1Y19kZiB8Pg0KICBncm91cF9ieShZZWFyKSB8Pg0KICBzdW1tYXJpemUoY3Jvc3NyZWdtZWQgPSBtZWRpYW4obWVkaWFuX3ZhbHVlKSkNCiMgZWNvem1lZGlhbg0KYGBgDQoNCiMjIyMjICoqRmlndXJlIDk6KiogTWVkaWFuIHZhbHVlIHRyZW5kIG9mIHRoZSBOZXQgZW5yb2xtZW50IHJhdGUsIGVhcmx5IGNoaWxkaG9vZCBlZHVjYXRpb24sIGZvciBkaWZmZXJlbnQgcmVnaW9uIGZyb20gMjAxNSB0byAyMDIyLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGggPSA5LjUsIGZpZy5oZWlnaHQgPSA2LCBvdXQud2lkdGg9ICIxMDAlIn0NCmdncGxvdGx5KA0KICByZWduZXJlY2VkdWNfZGYgfD4NCiAgICAjIGZpbHRlcigNCiAgICAjICAgcmVnaW9uICVpbiUgYygNCiAgICAjICAgICAiRXVyb3BlICYgQ2VudHJhbCBBc2lhIiwgIkxhdGluIEFtZXJpY2EgJiBDYXJpYmJlYW4iLCAiU3ViLVNhaGFyYW4gQWZyaWNhIg0KICAgICMgICApDQogICAgIyApIHw+DQogIGdncGxvdCgNCiAgICBhZXMoDQogICAgICB4ID0gWWVhciwNCiAgICAgIHkgPSBtZWRpYW5fdmFsdWUsDQogICAgICBjb2xvciA9IHJlZ2lvbg0KICAgICkNCiAgKSArDQogICAgZ2VvbV9saW5lKHNpemUgPSAuOCkgKw0KICAgIGdlb21fbGluZSgNCiAgICAgIGRhdGEgPSByZWdtZWRpYW4sDQogICAgICBhZXMoeCA9IFllYXIsIHkgPSBjcm9zc3JlZ21lZCksDQogICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiLA0KICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgc2l6ZSA9IDENCiAgICApICsNCiAgICAgZ2VvbV90ZXh0KA0KICAgICAgYWVzKHggPSAyMDE4LCB5ID0gMCwgbGFiZWwgPSAi4pagIOKWoCDilqAgQ3Jvc3MtcmVnaW9uYWwgbWVkaWFuIHZhbHVlIiksIA0KICAgICAgaGp1c3QgPSAwLjUsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiYmxhY2siDQogICAgKSArDQogICAgZ2VvbV9saW5lKA0KICAgICAgYWVzKHggPSBZZWFyLCB5ID0gdGFyZ2V0KSwNCiAgICAgIGNvbG9yID0gImRhcmtncmVlbiIsDQogICAgICBzaXplID0gMSwNCiAgICAgIGxpbmV0eXBlID0gImRvdHRlZCINCiAgICApICsNCiAgICBnZW9tX3RleHQoDQogICAgICBhZXMoeCA9IDIwMTgsIHkgPSAxMCwgbGFiZWwgPSAi4pagIOKWoCDilqAgRWR1Y2F0aW9uIDIwMzAgRkZBIFRhcmdldCIpLCANCiAgICAgIGhqdXN0ID0gMC41LCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtncmVlbiINCiAgICApICsNCiAgICBnZW9tX3NlZ21lbnQoDQogICAgICBhZXMoeCA9IDIwMjEsIHhlbmQgPSAyMDIxLCB5ID0gNDQuMywgeWVuZCA9IDEwMCksDQogICAgICBjb2xvciA9ICJyZWQiLA0KICAgICAgc2l6ZSA9IDEsDQogICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiDQogICAgKSAgKw0KICAgIGdlb21fdGV4dCgNCiAgICAgIGFlcyh4ID0gMjAxOCwgeSA9IDg1LA0KICAgICAgbGFiZWwgPSAiVGhlIGdhcCBiZXR3ZWVuIHRoZSB0YXJnZXRcbiBhbmQgdGhlIGNyb3NzLXJlZ2lvbmFsJ3NcbiB2YWx1ZSBpbiAyMDIxIGlzIDQ0IiksDQogICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJyZWQiDQogICAgKSArDQogICAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheSIpKSArDQogICAgc2NhbGVfY29sb3JfbWFudWFsKA0KICAgICAgdmFsdWVzID0gYygNCiAgICAgICAgImRhcmtibHVlIiwgIm9yYW5nZTMiLCAicHVycGxlMyIsICJicm93bjQiLCAiZGFya2dyZWVuIiwgInBpbmszIiwgImRvZGdlcmJsdWUiDQogICAgICApDQogICAgKSArDQogICAgbGFicygNCiAgICAgICN0aXRsZSA9ICJTbW9vdGggTGluZSBQbG90IHdpdGggTGVnZW5kIGFuZCBNYXJrZXJzIiwNCiAgICAgIHggPSAiWWVhciIsDQogICAgICB5ID0gIk1lZGlhbiBWYWx1ZSIsDQogICAgICBjYXB0aW9uID0gIlNvdXJjZTogaHR0cDovL3NkZzQtZGF0YS51aXMudW5lc2NvLm9yZy8iDQogICAgKSANCikNCmBgYA0KDQojIyMjIyAqKlNvdXJjZSA6IDxodHRwOi8vc2RnNC1kYXRhLnVpcy51bmVzY28ub3JnLz4qKg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFLCBlY2hvPUZBTFNFfQ0KZWNvem5lcmVjZWR1Y19kZiA8LSBuZXJlY2VkdWNfZGYgfD4NCiAgZ3JvdXBfYnkoYEluY29tZSBncm91cGAsIFllYXIpIHw+DQogIHN1bW1hcml6ZShtZWRpYW5fdmFsdWUgPSBtZWRpYW4oVmFsdWUpKSB8Pg0KICBtdXRhdGUodGFyZ2V0ID0gMTAwKQ0KICAjIHNlbGVjdChZZWFyLCBSZWdpb24sIFZhbHVlKQ0KI3ZpZXcoZWNvel9kZikNCm9wZW54bHN4Ojp3cml0ZS54bHN4KGVjb3puZXJlY2VkdWNfZGYsICJkYXRhL3RpZHkvZWNvem5lcmVjZWR1Y19kZi54bHN4IikNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KZWNvem1lZGlhbiA8LSBlY296bmVyZWNlZHVjX2RmIHw+DQogIGdyb3VwX2J5KFllYXIpIHw+DQogIHN1bW1hcml6ZShjcm9zc2Vjb3ptZWQgPSBtZWRpYW4obWVkaWFuX3ZhbHVlKSkNCiMgZWNvem1lZGlhbg0KYGBgDQoNCiMjIyMjICoqRmlndXJlIDEwOioqIE1lZGlhbiB2YWx1ZSB0cmVuZCBvZiB0aGUgTmV0IGVucm9sbWVudCByYXRlLCBlYXJseSBjaGlsZGhvb2QgZWR1Y2F0aW9uLCBmb3IgZGlmZmVyZW50IEluY29tZSBncm91cHMgZnJvbSAyMDE1IHRvIDIwMjIuDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aCA9IDkuNSwgZmlnLmhlaWdodCA9IDYsIG91dC53aWR0aD0gIjEwMCUifQ0KZ2dwbG90bHkoDQogIGdncGxvdCgNCiAgICBlY296bmVyZWNlZHVjX2RmLA0KICAgIGFlcygNCiAgICAgIHggPSBZZWFyLA0KICAgICAgeSA9IG1lZGlhbl92YWx1ZSwNCiAgICAgIGNvbG9yID0gYEluY29tZSBncm91cGANCiAgICApDQogICkgKw0KICAgIGdlb21fbGluZShzaXplID0gLjgpICsNCiAgICBnZW9tX2xpbmUoDQogICAgICBhZXMoeCA9IFllYXIsIHkgPSB0YXJnZXQpLA0KICAgICAgY29sb3IgPSAiZGFya2dyZWVuIiwNCiAgICAgIHNpemUgPSAxLjIsDQogICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiDQogICAgKSArDQogICAgZ2VvbV90ZXh0KA0KICAgICAgYWVzKHggPSAyMDE4LCB5ID0gMTA1LCBsYWJlbCA9ICLilqAg4pagIOKWoCBFZHVjYXRpb24gMjAzMCBGRkEgVGFyZ2V0IiksIA0KICAgICAgaGp1c3QgPSAwLjUsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2dyZWVuIg0KICAgICkgKw0KICAgIGdlb21fbGluZSgNCiAgICAgIGRhdGEgPSBlY296bWVkaWFuLA0KICAgICAgYWVzKHggPSBZZWFyLCB5ID0gY3Jvc3NlY296bWVkKSwNCiAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsDQogICAgICBjb2xvciA9ICJibGFjayIsDQogICAgICBzaXplID0gMS4yDQogICAgKSArDQogICAgIGdlb21fdGV4dCgNCiAgICAgIGFlcyh4ID0gMjAxOCwgeSA9IDAsIGxhYmVsID0gIuKWoCDilqAg4pagIENyb3NzLWluY29tZSBncm91cCBtZWRpYW4gdmFsdWUiKSwgDQogICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJibGFjayINCiAgICApICsNCiAgICBnZW9tX3NlZ21lbnQoDQogICAgICBhZXMoeCA9IDIwMjEsIHhlbmQgPSAyMDIxLCB5ID0gMzUuMDM3NSwgeWVuZCA9IDEwMCksDQogICAgICBjb2xvciA9ICJyZWQiLA0KICAgICAgc2l6ZSA9IDEsDQogICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiDQogICAgKSAgKw0KICAgIGdlb21fdGV4dCgNCiAgICAgIGFlcyh4ID0gMjAxOCwgeSA9IDg1LA0KICAgICAgbGFiZWwgPSAiVGhlIGdhcCBiZXR3ZWVuIHRoZSB0YXJnZXRcbiBhbmQgdGhlIGNyb3NzLWVjb25vbWljJ3NcbiB2YWx1ZSBpbiAyMDIxIGlzIDY1IiksDQogICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJyZWQiDQogICAgKSArDQogICAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheSIpKSArDQogICAgc2NhbGVfY29sb3JfbWFudWFsKA0KICAgICAgdmFsdWVzID0gYygNCiAgICAgICAgInJlZDQiLCJwdXJwbGUzIiAsICJkYXJrYmx1ZSIsICJvcmFuZ2UzIg0KICAgICAgKQ0KICAgICkgKw0KICAgIGxhYnMoDQogICAgICAjdGl0bGUgPSAiU21vb3RoIExpbmUgUGxvdCB3aXRoIExlZ2VuZCBhbmQgTWFya2VycyIsDQogICAgICB4ID0gIlllYXIiLA0KICAgICAgeSA9ICJNZWRpYW4gVmFsdWUiDQogICAgKQ0KKQ0KYGBgDQoNCiMjIyMjICoqU291cmNlIDogPGh0dHA6Ly9zZGc0LWRhdGEudWlzLnVuZXNjby5vcmcvPioqDQoNCiMjIEFuYWx5c2lzIG9mIHRoZSBOZXQgZW5yb2xtZW50IHJhdGUsIHByZS1wcmltYXJ5LCBib3RoIHNleGVzICglKQ0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFLCBlY2hvPUZBTFNFfQ0KbmVycHByaW1fZGYgPC0gZGYgfD4NCiAgZmlsdGVyKA0KICAgIFllYXIgJWluJSBzZXEoMjAxNSwgMjAyMSksDQogICAgYEluZGljYXRvciBOYW1lYCA9PSAiTmV0IGVucm9sbWVudCByYXRlLCBwcmUtcHJpbWFyeSwgYm90aCBzZXhlcyAoJSkiDQogICkNCm9wZW54bHN4Ojp3cml0ZS54bHN4KG5lcnBwcmltX2RmLCAiZGF0YS90aWR5L25lcnBwcmltX2RmLnhsc3giKQ0KIyBnbGltcHNlKG9zcl9kZikNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFLCBlY2hvPUZBTFNFfQ0KcmVnbmVycHByaW1fZGYgPC0gbmVycHByaW1fZGYgfD4NCiAgZ3JvdXBfYnkocmVnaW9uLCBZZWFyKSB8Pg0KICBzdW1tYXJpemUobWVkaWFuX3ZhbHVlID0gbWVkaWFuKFZhbHVlKSkgfD4NCiAgbXV0YXRlKHRhcmdldCA9IDEwMCkNCiAgIyBzZWxlY3QoWWVhciwgUmVnaW9uLCBWYWx1ZSkNCiN2aWV3KHJlZ19kZikNCm9wZW54bHN4Ojp3cml0ZS54bHN4KHJlZ25lcnBwcmltX2RmLCAiZGF0YS90aWR5L3JlZ25lcnBwcmltX2RmLnhsc3giKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpyZWdtZWRpYW4gPC0gcmVnbmVycHByaW1fZGYgfD4NCiAgZ3JvdXBfYnkoWWVhcikgfD4NCiAgc3VtbWFyaXplKGNyb3NzcmVnbWVkID0gbWVkaWFuKG1lZGlhbl92YWx1ZSkpDQojIGVjb3ptZWRpYW4NCmBgYA0KDQojIyMjIyAqKkZpZ3VyZSAxMToqKiBNZWRpYW4gdmFsdWUgdHJlbmQgb2YgdGhlIE5ldCBlbnJvbG1lbnQgcmF0ZSwgcHJlLXByaW1hcnksIGZvciBkaWZmZXJlbnQgcmVnaW9uIGZyb20gMjAxNSB0byAyMDIyLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGggPSA5LjUsIGZpZy5oZWlnaHQgPSA2LCBvdXQud2lkdGg9ICIxMDAlIn0NCmdncGxvdGx5KA0KICByZWduZXJwcHJpbV9kZiB8Pg0KICAgICMgZmlsdGVyKA0KICAgICMgICByZWdpb24gJWluJSBjKA0KICAgICMgICAgICJFdXJvcGUgJiBDZW50cmFsIEFzaWEiLCAiTGF0aW4gQW1lcmljYSAmIENhcmliYmVhbiIsICJTdWItU2FoYXJhbiBBZnJpY2EiDQogICAgIyAgICkNCiAgICAjICkgfD4NCiAgZ2dwbG90KA0KICAgIGFlcygNCiAgICAgIHggPSBZZWFyLA0KICAgICAgeSA9IG1lZGlhbl92YWx1ZSwNCiAgICAgIGNvbG9yID0gcmVnaW9uDQogICAgKQ0KICApICsNCiAgICBnZW9tX2xpbmUoc2l6ZSA9IC44KSArDQogICAgZ2VvbV9saW5lKA0KICAgICAgZGF0YSA9IHJlZ21lZGlhbiwNCiAgICAgIGFlcyh4ID0gWWVhciwgeSA9IGNyb3NzcmVnbWVkKSwNCiAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsDQogICAgICBjb2xvciA9ICJibGFjayIsDQogICAgICBzaXplID0gMS4yDQogICAgKSArDQogICAgIGdlb21fdGV4dCgNCiAgICAgIGFlcyh4ID0gMjAxOCwgeSA9IDAsIGxhYmVsID0gIuKWoCDilqAg4pagIENyb3NzLXJlZ2lvbmFsIG1lZGlhbiB2YWx1ZSIpLCANCiAgICAgIGhqdXN0ID0gMC41LCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImJsYWNrIg0KICAgICkgKw0KICAgIGdlb21fbGluZSgNCiAgICAgIGFlcyh4ID0gWWVhciwgeSA9IHRhcmdldCksDQogICAgICBjb2xvciA9ICJkYXJrZ3JlZW4iLA0KICAgICAgc2l6ZSA9IDEuMiwNCiAgICAgIGxpbmV0eXBlID0gImRvdHRlZCINCiAgICApICsNCiAgICBnZW9tX3RleHQoDQogICAgICBhZXMoeCA9IDIwMTgsIHkgPSAxMDUsIGxhYmVsID0gIuKWoCDilqAg4pagIEVkdWNhdGlvbiAyMDMwIEZGQSBUYXJnZXQiKSwgDQogICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrZ3JlZW4iDQogICAgKSArDQogICAgZ2VvbV9zZWdtZW50KA0KICAgICAgYWVzKHggPSAyMDIxLCB4ZW5kID0gMjAyMSwgeSA9IDUzLjg0LCB5ZW5kID0gMTAwKSwNCiAgICAgIGNvbG9yID0gInJlZCIsDQogICAgICBzaXplID0gMSwNCiAgICAgIGxpbmV0eXBlID0gImRvdHRlZCINCiAgICApICArDQogICAgIyBnZW9tX3RleHQoDQogICAgIyAgIGFlcyh4ID0gMjAxOCwgeSA9IDg1LA0KICAgICMgICBsYWJlbCA9ICJUaGUgZ2FwIGJldHdlZW4gdGhlIHRhcmdldFxuIGFuZCB0aGUgY3Jvc3MtcmVnaW9uYWwnc1xuIHZhbHVlIGluIDIwMjEgaXMgNDQiKSwNCiAgICAjICAgaGp1c3QgPSAwLjUsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAicmVkIg0KICAgICMgKSArDQogICAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheSIpKSArDQogICAgc2NhbGVfY29sb3JfbWFudWFsKA0KICAgICAgdmFsdWVzID0gYygNCiAgICAgICAgImRhcmtibHVlIiwgIm9yYW5nZTMiLCAicHVycGxlMyIsICJicm93bjQiLCAiZGFya2dyZWVuIiwgInBpbmszIiwgImRvZGdlcmJsdWUiDQogICAgICApDQogICAgKSArDQogICAgbGFicygNCiAgICAgICN0aXRsZSA9ICJTbW9vdGggTGluZSBQbG90IHdpdGggTGVnZW5kIGFuZCBNYXJrZXJzIiwNCiAgICAgIHggPSAiWWVhciIsDQogICAgICB5ID0gIk1lZGlhbiBWYWx1ZSIsDQogICAgICBjYXB0aW9uID0gIlNvdXJjZTogaHR0cDovL3NkZzQtZGF0YS51aXMudW5lc2NvLm9yZy8iDQogICAgKSANCikNCmBgYA0KDQojIyMjIyAqKlNvdXJjZSA6IDxodHRwOi8vc2RnNC1kYXRhLnVpcy51bmVzY28ub3JnLz4qKg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFLCBlY2hvPUZBTFNFfQ0KZWNvem5lcnBwcmltX2RmIDwtIG5lcnBwcmltX2RmIHw+DQogIGdyb3VwX2J5KGBJbmNvbWUgZ3JvdXBgLCBZZWFyKSB8Pg0KICBzdW1tYXJpemUobWVkaWFuX3ZhbHVlID0gbWVkaWFuKFZhbHVlKSkgfD4NCiAgbXV0YXRlKHRhcmdldCA9IDEwMCkNCiAgIyBzZWxlY3QoWWVhciwgUmVnaW9uLCBWYWx1ZSkNCiN2aWV3KGVjb3pfZGYpDQpvcGVueGxzeDo6d3JpdGUueGxzeChlY296bmVycHByaW1fZGYsICJkYXRhL3RpZHkvZWNvem5lcnBwcmltX2RmLnhsc3giKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0V9DQplY296bWVkaWFuIDwtIGVjb3puZXJwcHJpbV9kZiB8Pg0KICBncm91cF9ieShZZWFyKSB8Pg0KICBzdW1tYXJpemUoY3Jvc3NlY296bWVkID0gbWVkaWFuKG1lZGlhbl92YWx1ZSkpDQojIGVjb3ptZWRpYW4NCmBgYA0KDQojIyMjIyAqKkZpZ3VyZSAxMjoqKiBNZWRpYW4gdmFsdWUgdHJlbmQgb2YgdGhlIE5ldCBlbnJvbG1lbnQgcmF0ZSwgcHJlLXByaW1hcnksIGZvciBkaWZmZXJlbnQgSW5jb21lIGdyb3VwcyBmcm9tIDIwMTUgdG8gMjAyMi4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoID0gOS41LCBmaWcuaGVpZ2h0ID0gNiwgb3V0LndpZHRoPSAiMTAwJSJ9DQpnZ3Bsb3RseSgNCiAgZ2dwbG90KA0KICAgIGVjb3puZXJlY2VkdWNfZGYsDQogICAgYWVzKA0KICAgICAgeCA9IFllYXIsDQogICAgICB5ID0gbWVkaWFuX3ZhbHVlLA0KICAgICAgY29sb3IgPSBgSW5jb21lIGdyb3VwYA0KICAgICkNCiAgKSArDQogICAgZ2VvbV9saW5lKHNpemUgPSAuOCkgKw0KICAgIGdlb21fbGluZSgNCiAgICAgIGFlcyh4ID0gWWVhciwgeSA9IHRhcmdldCksDQogICAgICBjb2xvciA9ICJkYXJrZ3JlZW4iLA0KICAgICAgc2l6ZSA9IDEuMiwNCiAgICAgIGxpbmV0eXBlID0gImRvdHRlZCINCiAgICApICsNCiAgICBnZW9tX3RleHQoDQogICAgICBhZXMoeCA9IDIwMTgsIHkgPSAxMDUsIGxhYmVsID0gIuKWoCDilqAg4pagIEVkdWNhdGlvbiAyMDMwIEZGQSBUYXJnZXQiKSwgDQogICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrZ3JlZW4iDQogICAgKSArDQogICAgZ2VvbV9saW5lKA0KICAgICAgZGF0YSA9IGVjb3ptZWRpYW4sDQogICAgICBhZXMoeCA9IFllYXIsIHkgPSBjcm9zc2Vjb3ptZWQpLA0KICAgICAgbGluZXR5cGUgPSAiZG90dGVkIiwNCiAgICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgIHNpemUgPSAxLjINCiAgICApICsNCiAgICAgZ2VvbV90ZXh0KA0KICAgICAgYWVzKHggPSAyMDE4LCB5ID0gMCwgbGFiZWwgPSAi4pagIOKWoCDilqAgQ3Jvc3MtaW5jb21lIGdyb3VwIG1lZGlhbiB2YWx1ZSIpLCANCiAgICAgIGhqdXN0ID0gMC41LCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImJsYWNrIg0KICAgICkgKw0KICAgIGdlb21fc2VnbWVudCgNCiAgICAgIGFlcyh4ID0gMjAyMSwgeGVuZCA9IDIwMjEsIHkgPSA1Mi41MzUwLCB5ZW5kID0gMTAwKSwNCiAgICAgIGNvbG9yID0gInJlZCIsDQogICAgICBzaXplID0gMSwNCiAgICAgIGxpbmV0eXBlID0gImRvdHRlZCINCiAgICApICArDQogICAgZ2VvbV90ZXh0KA0KICAgICAgYWVzKHggPSAyMDE4LCB5ID0gODUsDQogICAgICBsYWJlbCA9ICJUaGUgZ2FwIGJldHdlZW4gdGhlIHRhcmdldFxuIGFuZCB0aGUgY3Jvc3MtZWNvbm9taWMnc1xuIHZhbHVlIGluIDIwMjEgaXMgNDcuNSIpLA0KICAgICAgaGp1c3QgPSAwLjUsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAicmVkIg0KICAgICkgKw0KICAgIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImdyYXkiKSkgKw0KICAgIHNjYWxlX2NvbG9yX21hbnVhbCgNCiAgICAgIHZhbHVlcyA9IGMoDQogICAgICAgICJyZWQ0IiwicHVycGxlMyIgLCAiZGFya2JsdWUiLCAib3JhbmdlMyINCiAgICAgICkNCiAgICApICsNCiAgICBsYWJzKA0KICAgICAgI3RpdGxlID0gIlNtb290aCBMaW5lIFBsb3Qgd2l0aCBMZWdlbmQgYW5kIE1hcmtlcnMiLA0KICAgICAgeCA9ICJZZWFyIiwNCiAgICAgIHkgPSAiTWVkaWFuIFZhbHVlIg0KICAgICkNCikNCmBgYA0KDQojIyMjIyAqKlNvdXJjZSA6IDxodHRwOi8vc2RnNC1kYXRhLnVpcy51bmVzY28ub3JnLz4qKg0K